0

ブロックステートメント内でラベルのアルファを設定しようとしているため、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 に答える