我有一个ContactsViewController,每当选择一行时,就会打开MessageViewController(使用pushViewController)。 ContactsViewController 和 MessageViewController 都“注册”以接收 DatastoreDelegate 消息。奇怪的是,在加载我的应用程序时一切正常,但是一旦我导航到 MessageViewController,ContactsViewController 上的委托(delegate)方法就不再被调用。这两个 Controller 都应该处理 [messageAdded:(Message *)message] 方法,但只有 MessageViewController 在打开一次后会继续接收消息。
有人知道如何实现这项工作吗?
最佳答案
在 Cocoa 中,每个具有委托(delegate)的对象只有一个委托(delegate)(在任何给定时间)。该委托(delegate)是获取委托(delegate)消息的唯一对象。不存在“两个对象都注册以接收委托(delegate)消息”的真正概念。我的怀疑是,当您推送 MessageViewController 时,它会将自己设置为数据存储区的委托(delegate),然后 ContactsViewController 再也不会看到这些消息,因为它不会将自己设置回来。
我不知道您的代码是如何构造的,但您可以在每次 Controller 更改 View 时简单地移交委托(delegate),以便无论哪个事件状态都是当前委托(delegate)。
在 Cocoa 中,当一个对象需要向多个其他对象“广播”信息时,会使用通知模式(参见 NSNotificationCenter)。委托(delegate)实际上就像它们听起来的那样:一个对象,另一个对象可以选择依赖它来与其“合作”并提供关键功能。这是一种比通知观察者更亲密的关系。
关于cocoa - 未调用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185627/