xcode 如何使用 postNotificationName:object 传递 NSDictionary:

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4127284/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 03:35:14  来源:igfitidea点击:

How to pass a NSDictionary with postNotificationName:object:

iphonexcodensdictionarynsnotificationcenter

提问by user278859

I am trying to pass an NSDictionary form a UIView to a UIViewController using NSNotificationCenter. The dictionary works fine at the time the notification is posted, but in the receiving method I am unable to access any of the objects in the dictionary.

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

Here is how I am creating the dictionary and posting the notification...

这是我创建字典和发布通知的方式...

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

In the UIViewController I am setting the observer...

在 UIViewController 我设置观察者...

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

For testing purposes hotSpotMore looks like this...

出于测试目的 hotSpotMore 看起来像这样......

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

The first NSLog works fine displaying the contents of the dictionary. The second log throws the following exception...

第一个 NSLog 可以很好地显示字典的内容。第二个日志抛出以下异常...

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

I don't understand why I cannot access any objects in the passed dictionary.

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

Thanks in advance for any help.

在此先感谢您的帮助。

John

约翰

回答by Matthias Bauch

The first NSLog works fine displaying the contents of the dictionary. The second log throws the following exception...

第一个 NSLog 可以很好地显示字典的内容。第二个日志抛出以下异常...

The program tries to trick you, it just looks like it is your dictionary because your dictionary is inside the notification. From the exception you can see that your object actually is from a class named NSConcreteNotification.
This is because the argument of a notification-method is always a NSNotification-object. this will work:

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

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


just as a hint: the object is usually the object which sends the notification, you should send your NSDictionary as userInfo.
I think it would improve your code if you would do it like this:

提示:对象通常是发送通知的对象,您应该将 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"]);    
}

The object parameter is used to distinguish between the different objects that can send a notification.
Let's say you have two different HotSpot objects that can both send the notification. When you set the objectin addObserver:selector:name:object:you can add a different observer for each of the objects. Using nil as the object parameter means that all notifications should be received, regardless of the object that did send the notification.

object 参数用于区分可以发送通知的不同对象。
假设您有两个不同的 HotSpot 对象,它们都可以发送通知。当您设置objectin 时,addObserver:selector:name:object:您可以为每个对象添加不同的观察者。使用 nil 作为对象参数意味着应该接收所有通知,而不管发送通知的对象。

E.g:

例如:

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
}

回答by Amit Singh

This is the best way to pass your dictionary data with NSNotification.

这是通过 NSNotification 传递字典数据的最佳方式。

Post Notification :

发布通知:

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

Add Observer for Handle the Notification.

添加观察者以处理通知。

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

Put Notification Handler method.

放置通知处理程序方法。

- (void)mydictionaryData::(NSNotification*)notification{
   NSDictionary* userInfo = notification.userInfo;
   NSLog (@"Successfully received test notification! %@", userInfo);}

I hope, this solution will help you

我希望这个解决方案可以帮助你

回答by Brabbeldas

The method Matthias is talking about and the one I think you should be using is

马蒂亚斯所说的方法,我认为你应该使用的方法是

postNotificationName:object:userInfo:

Where object is the sender and userInfo is your dictionary.

其中 object 是发件人,userInfo 是您的字典。