NSNotification无法到达所有观察者

3
我使用 NSNotification 处理一组特定的事件。我有三个视图,视图1上有一个“ADD”按钮,点击该按钮将使我从视图1导航到视图2,再到视图3,然后返回到视图1。 1->2->3->1 如果在视图1上单击 ADD 按钮,则使用 NSNotification 推送一个视图控制器,并根据由 View 1 发布的通知更新其他视图。
当从视图1发送通知时,只有视图2收到它,而视图3没有收到。
这是怎么可能的?视图2和视图3中观察者的代码完全相同。
以下是在视图2和视图3中添加观察者的代码:
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(didPressAdd:) 
                                             name:@"DidAddNotification" 
                                           object:nil];

我还会在dealloc()函数中适当地移除它们。


你可能在viewDidLoad或类似的方法中添加了观察者,但是视图还没有加载完成。因此它尚未注册通知,无法接收到通知。 - vakio
我在viewDidLoad中尝试过(没有用)。我也在viewWillAppear中尝试过(也不行):| - Legolas
请看我的回答,评论框太小了。 - vakio
1
但是它与this有什么不同呢? - Deepak Danduprolu
@Deepak:你能试试这个吗?在点击“添加”时,从DogTableViewcontroller发布一个新的通知。将另外两个视图作为观察者添加,并使用它们通常的导航方式来点击视图1中的“添加”。然后用NSLog记录它们。 - Legolas
显示剩余2条评论
2个回答

3

使用导航控制器返回到1将删除2和3。因此,在dealloc中,添加一个日志,说明特定的控制器已停止监听。您将看到侦听器在被释放后不再侦听通知。更新示例以在返回时发送通知。


Deepak,我之前在评论中已经发布了这个链接。但是我再次发布一下... http://www.cl.ly/3q0o2w0l003O1y122D2c 这就是我想要做的事情... - Legolas
当然,我会立即检查。在这个示例中 http://www.cl.ly/0P30391a3J2n1y0h0n1x ,为什么观察者接收通知时不输出 NSLog? - Legolas
Deepak,你发给我的那份代码...有相同的问题。能上聊天吗? - Legolas
好的。但是我发送的最新代码可以正确地执行,即2和3都会收到通知。您可以重新检查一下。 - Deepak Danduprolu
样例在这里。可能不是完全功能的副本,但可以给您一个想法。 - Deepak Danduprolu
显示剩余9条评论

1

原因是viewDidLoadviewWillAppear:在发送通知后被调用。如果你使用xib文件,请在initWithNibName:bundle:中设置它,否则请在其他init方法中设置(例如initWithCoder:),假设你已经在某个地方初始化了控制器。如果你没有初始化控制器,你也无法在其中监听通知。


所以我将代码粘贴到视图3的styleWithStyle方法中,并添加了一个NSLog。它只有在我从视图2导航到视图3时才会被调用。根据你的说法 - “如果您没有初始化控制器,那么您也无法在其中侦听通知。”当我点击添加时,我该如何初始化视图三? - Legolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接