2010-11-30 7 views
69

誰かがNSNotifcationCenterのオブジェクトプロパティを使用する方法を教えてください。私はそれを使用してセレクタメソッドに整数値を渡すことができるようにしたい。NSNotificationcenterのオブジェクトプロパティを使用する方法

これは、UIリスナーで通知リスナーを設定した方法です。整数値を渡したいので、nilを何に置き換えるべきか分かりません。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent:) name:@"myevent" object:nil]; 


- (void)receiveEvent:(NSNotification *)notification { 
    // handle event 
    NSLog(@"got event %@", notification); 
} 

私はこのような別のクラスからの通知をディスパッチします。この関数には、indexという名前の変数が渡されます。私が何らかの理由で通知を出して欲しいのは、この価値です。

-(void) disptachFunction:(int) index 
{ 
    int pass= (int)index; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:pass]; 
    //[[NSNotificationCenter defaultCenter] postNotificationName:<#(NSString *)aName#> object:<#(id)anObject#> 
} 

答えて

102

objectパラメータは、通知の送信者を表し、通常は次のとおりです。

- (void) disptachFunction:(int) index { 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:index] forKey:@"pass"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" object:nil userInfo:userInfo]; 
} 

あなたreceiveEvent方法は、このようなものになるだろう:

あなたdispatchFunction方法ではなく、このようなものになるだろうself

追加情報を渡す場合は、NSNotificationCenterメソッドpostNotificationName:object:userInfo:を使用する必要があります。これは任意の値の辞書を使用できます(自由に定義できます)。内容は整数のような整数型ではなく、実際のNSObjectのインスタンスである必要があります。そのため、整数値をNSNumberオブジェクトでラップする必要があります。

NSDictionary* dict = [NSDictionary dictionaryWithObject: 
         [NSNumber numberWithInt:index] 
         forKey:@"index"]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"myevent" 
             object:self 
             userInfo:dict]; 
+2

同時に心が働きます。 :) –

+0

私はあなたの選択をしました。私がやらなければならなかった唯一のことは、辞書の周りに自動解放プールをラップすることでした。 – dubbeat

+3

(ああ、私の解決策はMatthewのものと同じですが、ちょっと早くSubmitをクリックするだけでした) – gavinb

81

objectのプロパティーは適切ではありません。代わりに、あなたはuserinfoパラメータを使用する:あなたは、通知と一緒に情報を送信するために特別に、NSDictionaryのを見ることができるよう

+ (id)notificationWithName:(NSString *)aName 
        object:(id)anObject 
        userInfo:(NSDictionary *)userInfo 

userInfoは、あります。

- (void)receiveEvent:(NSNotification *)notification { 
    int pass = [[[notification userInfo] valueForKey:@"pass"] intValue]; 
} 
+0

"オブジェクトのプロパティは適切ではありません。"なぜそれは適切ではないのですか?とにかく、(例えば)NSString *を渡すためにオブジェクトプロパティを使用しようとすると。何が起こるか? – Selvin

+1

@Selvin通知を投稿するオブジェクトを送信するためのものです(使用したい場合は 'self'に設定します)。他に何かを置くとどうなりますか?私には分かりませんが、推測しなければならないのは、通知センタがリリースする必要のあるものを追跡するような、カバーの下で起こっていることを台無しにする可能性があります。オブジェクトを渡すための実際のシステムがある場合、なぜそれを危険にさらしますか? –

+3

"NSNotificationオブジェクト(通知と呼ばれる)には、名前、オブジェクト、およびオプションの辞書が含まれています。この名前は通知を識別するタグで、オブジェクトは、通知のポスターがオブザーバーに送信するオブジェクトですその通知(通常、通知自体を掲示したオブジェクト。辞書にはイベントに関する追加情報が含まれている可能性があります)。私には、 'self 'と' nil'以外のものを 'object:'に入れても結構です。 – max

関連する問題