0

我正在尝试在块语句中设置标签的 alpha,因此我调用 self. 据我了解,我不能直接从块语句中调用self,所以我必须先引用self。

这是我拥有的代码,但它不起作用:

    self.accountStore = [[ACAccountStore alloc] init];
    __weak UILabel *weakSelf = self.errorLabel;
    [self.accountStore requestAccessToAccountsWithType:twitterType options:NULL completion:^(BOOL granted, NSError *error) {
         if (!granted) {
             [weakSelf setAlpha:0.0f];
         } 
     }];

关于可能是什么问题的任何想法?

更新 1

我也尝试只引用自我,但没有运气:

self.accountStore = [[ACAccountStore alloc] init];
    __weak FrontPageViewController *weakSelf = self;
    [self.accountStore requestAccessToAccountsWithType:twitterType options:NULL completion:^(BOOL granted, NSError *error) {
         if (!granted) {
             [weakSelf.errorLabel setAlpha:0.0f];
         } 
     }];

更新 2

刚刚检查了错误标签是否为 nil 并且似乎不是:

if (self.errorLabel != nil) {
    NSLog(@"Errorlabel is not nil"); //Errorlabel is not nil
}

错误原因

错误是我想淡出标签后立即拥有此代码:

[UIView animateWithDuration:0.2f animations:^{
    //self.errorLabel.alpha = 0.0f;
} completion:^(BOOL success){
}];

我不完全明白为什么这会造成麻烦?

4

2 回答 2

1

您需要确保所有 UI 调用都是从主线程进行的。这包括任何animateWith...调用。最快的方法是将它们简单地包装在一个调度块中,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
    [UIView animateWithDuration:0.2f
                     animations:^{
                         self.errorLabel.alpha = 0.0f;
                     }
                     completion:nil];
});

如果您不确定您的代码是否在主线程上运行,您可以使用以下语句进行调试。

NSLog(@"Is main thread = %@",(dispatch_get_main_queue() == dispatch_get_current_queue())?@"YES":@"NO");

始终注意异步网络 API 上的完成处理程序。确保他们的文档说完成处理程序将在主线程上调用。如果没有,请放心,并将任何与 UI 相关的工作转移到主线程。

于 2012-11-17T23:40:57.937 回答
0
__block __weak UILabel *weakSelf = self.errorLabel;
于 2012-11-17T22:33:13.107 回答