15

我正在尝试使用NSNotificationCenterwith的一个实例addObserverpostNotificationName但我无法弄清楚为什么它不起作用。

我有 2 行代码来添加观察者并在 2 个不同的类中发送消息

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

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

如果我将名称设置为nil它可以正常工作,因为它只是一个广播,当我尝试定义一个通知名称时,消息永远不会通过。

4

7 回答 7

12

我所有的代码都NSNotifications像这样使用:

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

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];

第一个是注册通知和第二次发布通知。

于 2010-01-21T23:03:15.493 回答
11

基本上这与执行顺序有关。如果您在 addObserver 之前执行了 postNotificationName,那么这是一个容易出现的问题。使用断点并单步执行代码:)

你的第一个断点应该停在这里:

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

那么这里:

[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];

另外,确保选择器上有一个冒号。因为它的方法签名将是:

- (void)updateView:(NSNotification *)notification;
于 2013-07-10T23:34:08.997 回答
8

我有同样的问题。原因是我在

- (void)viewDidDisappear:(BOOL)animated{

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

   [notificationCenter removeObserver:self];

}

所以检查你是否在 postNotification 之前调用了 removeObserver。

提示:您可以搜索关键字“removeObserver”来查找您是否调用了该函数。

于 2014-12-05T12:30:13.000 回答
6

改变这个:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];

对此:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];

如果您的第一个通知已正确注册,则应调用 newEventLoaded。

于 2010-01-21T22:47:23.003 回答
4

我有一个类似的问题,我的问题是由于在另一个线程上调用了通知。这解决了我的问题。

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
于 2016-08-25T13:36:37.057 回答
2

除了 @"Event" 和 nil 之外,您是否尝试过其他名称?可以肯定的是,您可以在一个文件中定义您的事件名称,并将其包含在通知注册和发送中。例如:

头文件:

extern NSString * const NOTE_myEventName;

源文件:

NSString * const NOTE_myEventName = @"MyEventName";

登记:

[[NSNotificationCenter defaultCenter]
 addObserver:self
    selector:@selector(handleMyEvent:)
        name:NOTE_myEventName
      object:nil];

通知发送:

[[NSNotificationCenter defaultCenter]
    postNotificationName:NOTE_myEventName object:nil];
于 2010-01-22T00:59:23.607 回答
1

我成功修复了“调用NSNotification时未发送postNotificationName:”崩溃。

我发现真正的错误在于通知消息处理程序。

postNotificationNameaddObserver都可以作为这个线程的第一篇文章。

于 2011-01-03T00:22:14.877 回答