2010-02-02 141 views
0

我有一个ContactsViewController - 每当选择一行时 - 打开MessageViewController(使用pushViewController)。 ContactsViewController和MessageViewController都'注册'来接收DatastoreDelegate消息。奇怪的是,在加载我的应用程序时它一切正常,但是一旦我导航到MessageViewController,我的ContactsViewController上的委托方法就不会再被调用。这两个控制器都应该处理[messageAdded:(Message *)message]方法,但只有MessageViewController在打开一次后才继续接收消息。委托没有被调用

有没有人有任何想法如何使这项工作?

回答

1

在Cocoa中,每个具有委托的对象只有一个委托(在任何给定时间)。该委托是获取委托消息的唯一对象。 “没有注册的对象接收委托消息”没有真正的概念。这里我怀疑的是,当你推送MessageViewController时,它将自己设置为Datastore的委托,然后ContactsViewController再也不会看到这些消息,因为它没有设置回去。

我不知道你的代码是如何构造的,但是每当控制器更改视图时,你可以简单地将代理移交,因此无论哪个活动都是当前代理。

在Cocoa中,通知模式(请参阅NSNotificationCenter)用于当对象需要将信息“广播”到多个其他对象时。代表实际上听起来像这样:另一个对象可选择依赖的对象来“合作”它并提供关键功能。这是一个比通知观察者更亲密的关系。

+0

谢谢,我的印象是,代表们可以发送消息给多个类,但我想我错了这个假设。我将使用NotificationCenter或查找不同的方式来实现我的代码。 – 2010-02-02 16:30:45

+0

任何对象都可以将消息发送到多个类。类通常*不是*代表;你通常只会让一个实例成为一个委托。任何具有委托的对象只有一个委托;两个对象不能同时被委托。如果您需要,请使用通知。 – 2010-02-02 20:04:46