2

KVO を使用するのはこれが初めてで、すぐに行き詰まりました。問題は、observeValueForKeyPath が呼び出されたときに、同じクラスの別のメソッドを呼び出していることです。そして、そのメソッドはアラート ビューを表示しているだけです。私が考えた単純なことですが、アラートビューは表示されません。

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                     change:(NSDictionary *)change context:(void *)context
{
    [self beginUpdate];
}


 -(void)beginUpdate
 {
     NSLog(@"Check!");
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"message" message:@"Hi" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
     [alert show];
 } 

ログメッセージが表示されます。アラート メッセージは、observeValueForKeyPath 以外のメソッドから呼び出した場合にのみ表示されます。

4

1 に答える 1

5

私の知る限りobserveValueForKeyPath:、監視対象のオブジェクトを変更したスレッドのコンテキストで呼び出されます。一方、UI の変更はメイン スレッドでのみ行う必要があります。試す

dispatch_async(dispatch_get_main_queue(), ^{
    [self beginUpdate];
});

また

[self performSelectorOnMainThread:@selector(beginUpdate) withObject:nil waitUntilDone:NO]

UIAlertViewがメインスレッドで作成されるようにします。

于 2012-07-23T19:24:59.427 に答える