如何使用postNotificationName:object传递NSDictionary:

我正在尝试使用NSNotificationCenter将UIView的NSDictionaryforms传递给UIViewController。 在发布通知时,字典工作正常,但在接收方法中,我无法访问字典中的任何对象。

这是我如何创build字典和张贴通知…

itemDetails = [[NSDictionary alloc] initWithObjectsAndKeys:@"Topic 1", @"HelpTopic", nil]; [[NSNotificationCenter defaultCenter] postNotificationName:@"HotSpotTouched" object:itemDetails]; 

在UIViewController我设置观察者…

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

出于testing目的,hotSpotMore看起来像这样…

 - (void)hotSpotMore:(NSDictionary *)itemDetails{ NSLog(@"%@", itemDetails); NSLog(@"%@", [itemDetails objectForKey:@"HelpTopic"]); } 

第一个NSLog工作正常显示字典的内容。 第二个日志引发以下exception…

  [NSConcreteNotification objectForKey:]: unrecognized selector sent to instance 0x712b130 

我不明白为什么我不能访问传递的字典中的任何对象。

在此先感谢您的帮助。

约翰

第一个NSLog工作正常显示字典的内容。 第二个日志引发以下exception…

该程序试图欺骗你,它看起来就像是你的字典,因为你的字典是在通知内。 从exception,你可以看到你的对象实际上是从一个名为NSConcreteNotification的类。
这是因为通知方法的参数始终是一个NSNotification对象。 这将工作:

 - (void)hotSpotMore:(NSNotification *)notification { NSLog(@"%@", notification.object); NSLog(@"%@", [notification.object objectForKey:@"HelpTopic"]); } 

只是提示:对象通常是发送通知的对象,您应该将您的NSDictionary作为userInfo发送。
我认为这会改善你的代码,如果你这样做:

 NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center postNotificationName:@"HotSpotTouched" object:self userInfo:itemDetails]; - (void)hotSpotMore:(NSNotification *)notification { NSLog(@"%@", notification.userInfo); NSLog(@"%@", [notification.userInfo objectForKey:@"HelpTopic"]); } 

对象参数用于区分可以发送通知的不同对象。
假设您有两个不同的HotSpot对象可以发送通知。 在addObserver:selector:name:object:设置object ,可以为每个对象添加一个不同的观察者。 使用nil作为对象参数意味着应该接收所有的通知,而不pipe发送通知的对象是什么。

例如:

 FancyHotSpot *hotSpotA; FancyHotSpot *hotSpotB; // notifications from hotSpotA should call hotSpotATouched: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hotSpotATouched:) name:@"HotSpotTouched" object:hotSpotA]; // only notifications from hotSpotA will be received // notifications from hotSpotB should call hotSpotBTouched: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hotSpotBTouched:) name:@"HotSpotTouched" object:hotSpotB]; // only notifications from hotSpotB will be received // notifications from all objects should call anyHotSpotTouched: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(anyHotSpotTouched:) name:@"HotSpotTouched" object:nil]; // nil == “any object”, so all notifications with the name “HotSpotTouched” will be received - (void)hotSpotATouched:(NSNotification *)n { // only gets notification of hot spot A } - (void)hotSpotBTouched:(NSNotification *)n { // only gets notification of hot spot B } - (void)anyHotSpotTouched:(NSNotification *)n { // catches all notifications } 

这是使用NSNotification传递字典数据的最佳方法。

邮寄通知:

  [[NSNotificationCenter defaultCenter] postNotificationName:@"Put Your Notification Name" object:self userInfo:"Pass your dictionary name"]; 

添加观察者来处理通知。

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mydictionaryData:) name:@"Put Your Notification Name" object:nil]; 

把通知处理程序的方法。

 - (void)mydictionaryData:(NSDictionary *)sourceDictionary{ NSLog(@"%@", sourceDictionary); } 

我希望这个解决scheme能帮助你

马提亚斯正在谈论的方法,我认为你应该使用的方法是

 postNotificationName:object:userInfo: 

哪里对象是发件人和userInfo是你的字典。