2

我想讓我的控制器訂閱來自視圖的通知。但是,在這之前,我想確認一下如果可以查看其控制器的實例嗎?視圖可以知道其控制器嗎?

讓我爲您提供一個更具體的例子,說明我的想法。

我控制器創建的視圖,並通知它,這是它的控制器

self.gameView = [[GameView alloc] initWithController:self]; 

一旦完成,其認購的通知,從這一觀點

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

同時認爲做的事情,但是當正確的時間來臨,它發佈通知

[[NSNotificationCenter defaultCenter] postNotificationName: 
             @"SaySomethingClever" object:gvc]; 

爲了我要做到這一點,該視圖需要知道通知(gvc)的接收者。

我想利用這個機會和你是否以下是確定:

initWithController被調用時,視圖

-(id) initWithController: (GameViewController*)g { 
    gvc = g; 
    return [self initWithFrame:CGRectMake(0, 0, 480, 300)]; 
} 

其中initWithFrame:CGRectMake是處理特定視圖東西的私有方法。

一切工作正常,但是,我不知道這種做法是否在道德上是可以接受的

回答

4

如果視圖有對其控制器的引用,這並不是嚴格的問題,但看起來你真正的問題是對通知發佈方法的誤解。

object參數不是接收器。事實上,如果它是 - 如果通知的海報必須知道將要獲得通知的對象 - 那將會破壞通知的整個目的。你可以調用適當的方法!通知的要點是海報不需要需要知道正在監聽的其他對象。

object參數實際上被接收方用於以區分它應該關心哪些通知。最常見的是海報本身:

[[NSNotificationCenter defaultCenter] postNotificationName:IDidSomethingInteresting 
                object:self]; 

但它實際上可以是任何對象。

當通知註冊,您可以。指定一個特定的實例,其通知你感興趣這是object參數addObserver:...然後通知中心將只通過對這些通知的名字並指定什麼對象比賽。

即使你通過niladdObserver:...object,您可以檢查收到通知的對象,如果海報是一個你感興趣的只是行動。

例如,可能有幾個窗口在你的應用程序中,你可能有興趣知道其中一個是否調整大小,但你不關心其他人會發生什麼。你只傳遞一個窗口實例爲objectaddObserver:...

綜上所述,您認爲在這種情況下需要,以便參照其控制器的控制器接收發表的觀點通知。

另請參閱:"Posting Notifications"

+0

優秀的答案喬希!謝謝 – JAM 2012-02-27 05:26:26

+0

很高興有幫助!我寫的時候會覺得有點ra ra。 – 2012-02-27 05:28:16

1

我將集中控制器調用其它控制器(或理想模型方法)。
允許每個視圖使用其主要資源,並允許該視圖的控制器進行其他調用。

2

雖然這個概念是確定的,它並不需要你的情況:

[[NSNotificationCenter defaultCenter] postNotificationName:@"SaySomethingClever" 
                object:self]; 

NSNotification引用的對象通常是對象,帖子的通知。整個通知的想法是,海報不需要知道觀察員。

相關問題