2012-12-19 26 views
4

我在父被通知註冊(UIViewController的),像這樣:NSNotificationCenter的addObserver在子類中

SuperClass.m

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(notification:) 
               name:@"Notification" 
               object:nil]; 
} 

- (void)notification:(NSNotification *)notification { 

    // Do something for SuperClass with the notification 
} 

現在在子類(SuperClass.m的子類),我也聽相同的通知,像這樣:

SubClass.m

- (void)notification:(NSNotification *)notification { 

    // Do something specific for SubClass with the notification 
} 

這是一種可接受的(代碼)方式來處理在超類中的通知上進行操作時的一般行爲,以及在對子類中的通知進行操作時具有更具體的行爲?

+0

是的。評論必須太長。 – jrturton

+0

是的,當你調用這個通知函數時使用它,它在超級類及其子類中被調用。你可以認爲這是可以接受的代碼,如果你想在所有視圖中加載數據,例如當你的應用程序來自後臺時你需要刷新所有的數據.. –

+0

好吧。起初編碼時,我認爲只會調用子類的方法,但由於某種原因,似乎調用了超類「觀察者和子類」的觀察者。這就是爲什麼我沒有在我的子類的觀察者中調用超級。 –

回答

2

通常當您想要在子類中允許更具體的行爲,同時仍然保持超類的一般行爲時,您可以調用子類super。例如,-[UIViewController viewDidAppear:]文檔中提到:

您可以重寫此方法以執行與呈現視圖相關的其他任務。如果您重寫此方法,則必須在實施過程中的某個時刻致電super

所以你的通知設置是好的(雖然這是一個有點怪異有NSNotification對象作爲參數傳遞給你希望被覆蓋的方法) - 但你要打電話[super notification:notification]獲得超類的行爲好。

+0

我已經證實了這一點,現在我需要調用超級通知才能到達超類。這是預期的行爲。爲什麼我最初問這個問題是因爲這不是我經歷過的行爲。就像jrturton寫道,似乎我必須有每個類的2個實例活着。 –

相關問題