NSNotificationCenter 在通用应用程序的 iPhone 端不起作用

Posted

技术标签:

【中文标题】NSNotificationCenter 在通用应用程序的 iPhone 端不起作用【英文标题】:NSNotificationCenter not working on iPhone side of Universal App 【发布时间】:2010-12-16 23:05:31 【问题描述】:

我正在开发适用于 iPad 和 iPhone 的通用应用程序。我有一个共享应用程序委托、一个 iPad 应用程序委托(共享共享的子类)和一个 iPhone 应用程序委托(也是共享的子类)——所有这些都基于 XCode 中的模板。该应用程序还有一个用于导航的共享视图控制器。在 iPad 中,它用作 SplitViewController 中的主视图控制器。在 iPhone 应用程序中,它显示为 UINavigationController 的根视图控制器。

在我的共享应用程序委托中,我从我的网络服务器获取一些 JSON 来配置应用程序,当我完成解析该数据后,我将通知发布到 NSNotificationCenter (defaultCenter)。

[[NSNotificationCenter defaultCenter] postNotificationName:kDataReady object:nil];

共享视图控制器是此通知的观察者。

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

当我在 iPad 上运行应用程序时,共享视图控制器正在接收此通知并适当地调用选择器。在 iPhone 上运行时,它不是。 iPhone 和 iPad 之间的公共类以相同的顺序实例化,我可以通过控制台日志验证这一点。我不知道为什么这没有按预期工作。救命!

【问题讨论】:

【参考方案1】:

addObserver 方法肯定会在 iPhone 上调用吗?仅仅因为它是子类化并不意味着必要的超级调用已经到位。

【讨论】:

未在共享应用委托上调用 addObserver 方法。共享应用程序委托发布通知。 iPad 和 iPhone 的共同视图控制器是在它的 init 方法中添加观察者。在两台设备上调用相同的 init 方法,但只有 iPad 有效。 您是否验证过(使用调试器和所有)addObserver 真的被执行了?另外,上游定义的常量是否足以完全相同? 哦,最后一点:onDataReady:(id)sender 真的在 iPhone Viewcontroller 中定义了吗?为了给你更好的帮助,最好有其中一些类的 .h 文件.... 不确定如何验证 addObserver 是否正常工作,因为它在 NSNotificationCenter 中。我没有收到任何错误。 并且定义了onDataReady方法。它与 iPhone 中的视图控制器和 iPad 中的视图控制器相同。只有 iPad 工作。

以上是关于NSNotificationCenter 在通用应用程序的 iPhone 端不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 8 中使用带有 NSNotificationCenter 的小部件

消息通信机制NSNotificationCenter -备

NSNotificationCenter传值

在 NSNotificationCenter 中添加自定义属性

NSNotificationCenter addObserver 在 Swift 中调用私有方法

关闭时未收到 NSNotificationCenter 通知