gpt4 book ai didi

iphone - 如何传递带有 postNotificationName :object: 的 NSDictionary

转载 作者:行者123 更新时间:2023-12-03 18:13:27 32 4
gpt4 key购买 nike

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

这是我如何创建字典并发布通知...

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];

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

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

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

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

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

预先感谢您的帮助。

约翰

最佳答案

The first NSLog works fine displaying the contents of the dictionary. The second log throws the following 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"]);
}

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

例如:

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
}

关于iphone - 如何传递带有 postNotificationName :object: 的 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4127284/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com