0

私のクラス XI では、次のような通知を投稿します。

[[NSNotificationCenter defaultCenter] addObserver:viewController 
                                             selector:@selector(doThis:) 
                                                 name:@"myNotification" 
                                               object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object:nil];

私のクラス YI では、次のように受け取ります。

- (void) doThis: (NSNotification *) notification {
NSLog(@"It works.");
[uiTextView resignFirstResponder]; }

コンソールには NSLog メッセージが表示されますが、私の UITextView はキーボードを非表示にしません。(たとえば、viewDidLoad では、resignFirstResponder/becomeFirstResponder が機能します。)

私がしなければならない特別なことはありますか?

4

2 に答える 2

3

FWIW、すべてではありませんが、ほとんどの場合、オブザーバーは、別のオブジェクトではなく、オブザーバー自体によって追加および削除する必要があります。(オブザーバーが別のオブジェクトの前に消え、オブザーバーを適切に削除できなかった場合はどうなりますか? またはその逆ですか? オブザーバーをリークしたり、割り当て解除されたオブジェクトへの通知でクラッシュしたりするのは非常に簡単です。)

とにかく、まず最初に: uiTextView が nil ではなく、ファーストレスポンダーを指していることを確認しましたか? むしろ、 uiTextView はあなたが思っているものではないと思います。

于 2012-01-30T23:11:54.983 に答える
2

コンラッドが言うように、オブザーバーは自分で追加および削除する必要があります...

次のように、ベスト プラクティスを使用して、通知の名前を静的定数として定義します。

static NSString *const kMyNotification = @"myNotification";

なんで?@"myNotification" の両方が 2 つの異なるオブジェクトである可能性があり、notificationName が異なり、通知を受け取れないというリスクがあるためです。私は常にそれらを静的定数として宣言しているので、NSNotifications で問題が発生したことはありません。

次に、次のように使用します。

オブザーバーを登録するには

[[NSNotificationCenter defaultCenter] addObserver: self 
                                         selector: @selector(doThis:) 
                                             name: kMyNotification 
                                           object: nil];

お知らせを掲載するには

[[NSNotificationCenter defaultCenter] postNotificationName: kMyNotification 
                                                    object: nil];

オブザーバーを削除するには:

[[NSNotificationCenter defaultCenter] removeObserver: self];
于 2012-01-30T23:43:59.863 に答える