2010-02-02 142 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