【问题标题】:addObserver: name添加观察者:名称
【发布时间】:2013-03-08 09:28:40
【问题描述】:

我正在使用这样的 addObserver:

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

一切正常,但我认为当我不再需要它时移除观察者可能是一种很好的形式......我发现我需要使用这一行:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"observerName" object:nil];

问题是,当我更改我的 addObserver 行以包含名称以便 removeObserver 知道要删除哪个观察者时,不再调用通知。此行运行但在添加名称时被忽略:

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

我可以将名称设置回 nil 并且它再次起作用。 有人知道我在这里做错了什么吗?

谢谢!

【问题讨论】:

  • 你确定你的名字没有错字吗?
  • 你可能会遇到拼写错误,而不是给两次,所以使用const NSString *notificationName=@"observerName";并在所有地方使用它。

标签: iphone ios xcode nsnotificationcenter addobserver


【解决方案1】:

我认为您可能会误认为参数的含义。

name: 告诉系统您希望收到哪些通知。

self 是实际的观察者,所以当您removeOberserver:self 时,您将停止接收任何通知。

你应该再仔细阅读文档,看哪个是什么意思:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000219-SW1

例子见How to create a class to send and receive events through NSNotificationCenter in Objective-C?

【讨论】:

  • 谢谢 - 我在another stackoverflow thread 中读到我不应该在没有 name: 参数的情况下调用 removeObserver:self。
  • 感谢您让我知道名称:用于选择我们想要收听的系统通知,现在更好的是我只收到我特别想要的通知而不是每个通知。我还可以在 removeObserver:name:object: 函数中使用通知名称,它可以正常工作。因此,而不是 @"myNotificationName" 您需要一个实际的通知,例如名称中的 @"_UIImagePickerControllerUserDidCaptureItem":addObserver 和 removeObserver 的参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2012-01-21
相关资源
最近更新 更多