0


先週、私はこの質問をしました: iOS アプリ全体を更新する @Jim は、通知センターを使用するようにアドバイスしてくれました。通知の操作方法を理解できず、別の質問をするように言われました.1週間かけて自分で解決しようとしたので、ここに行きます.

複数のサブビューを持つビューがあります。サブビューの 1 つは検索バー (テーブルビューではなく、単なるカスタム テキスト ボックス) であり、ユーザーはここで新しい人を検索でき、アプリ全体が画面ごとに更新されます。

ユーザーが検索サブビューの [GO] ボタンをタップすると、サーバーを呼び出してすべてのデータを取得します。その後、この通知を投稿します。

 [self makeServerCalls];

[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:Nil];

親View Controllerのinitにリスナーがいます

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidLoad) name:@"New data" object:nil];

これはおそらく間違っていることを知っているので、私の状況で通知を適切に使用する方法を誰かに説明してもらえますか? または、私がやりたいことを行うためのより良い方法がある場合。

あなたが私に与えることができるどんな助けにも感謝します.

4

1 に答える 1

3

通知を投稿すると、すべての登録オブザーバーに通知されます。彼らは、メッセージを送信することで通知を受け取ります...セレクターによって識別されたものです。コメントで述べたように、使用しないviewDidLoadでください。このことを考慮...

- (void)newDataNotification:(NSNotification *notification) {
    // Do whatever you want to do when new data has arrived.
}

一部の初期のコード (viewDidLoad が適切な候補です):

[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(newDataNotification:)
           name:@"New data"
         object:nil];

ところで、それはひどい名前です。しかたがない。この登録は、オブジェクトからの名前で通知が投稿されるたびに、オブジェクトselfにメッセージが送信されることを示しています。メッセージを受信するオブジェクトを制限したい場合は、nil 以外の値を指定してください。newDataNotification:NSNotification"New data"

これで、通知を送信するときに、コードで行ったように簡単に送信できます。

[[NSNotificationCenter defaultCenter] postNotificationName:@"New data" object:nil];

そして、それは(実用的な目的のために)それ[self newDataNotification:notification]が呼び出されることを確認します。これで、通知とともにデータを送信することもできます。では、新しいデータが で表されるとしましょうnewDataObject。任意のオブジェクトからの通知を受け入れるため、次のことができます。

[[NSNotificationCenter defaultCenter]
    postNotificationName:@"New data"
                  object:newDataObject];

そして、あなたのハンドラーで:

- (void)newDataNotification:(NSNotification *notification) {
    // Do whatever you want to do when new data has arrived.
    // The new data is stored in the notification object
    NewData *newDataObject = notification.object;
}

または、ユーザー情報ディクショナリでデータを渡すこともできます。

[[NSNotificationCenter defaultCenter]
    postNotificationName:@"New data"
                  object:nil
                userInfo:@{
                          someKey : someData,
                       anotherKey : moreData,
                          }];

次に、ハンドラーは次のようになります...

- (void)newDataNotification:(NSNotification *notification) {
    // Do whatever you want to do when new data has arrived.
    // The new data is stored in the notification user info
    NSDictionary *newData = notification.userInfo;
}

もちろん、ブロック API でも同じことができます。

とにかく、オブザーバーを削除する必要があることに注意してください。がある場合はviewDidUnload、そこに入れる必要があります。さらに、それがdealloc同様に入っていることを確認してください:

- (void)dealloc {
    // This will remove this object from all notifications
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
于 2012-09-07T23:18:36.647 に答える