6

在我的iPad應用程序,在一類我註冊一個通知:NSNotificationCenter選擇不會被調用

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(selectedList:) name:@"TTSelectedList" object:nil]; 

selectedList:方法是這樣的:

- (void)selectedList:(NSNotification*)notification 
{ 
    NSLog(@"received notification"); 
} 
另一類

然後(一UITableViewController )當我選擇一行時發佈通知:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"posting notification"); 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TTSelectedList" object:nil]; 
} 

我可以確認通知已發佈,因爲「發佈通知」會記錄到控制檯,但「接收通知」永遠不會被調用,這意味着通知未收到且選擇器尚未被調用。我無法弄清楚是什麼原因造成的。

感謝

+1

一些愚蠢的東西,但讓我感到困惑了一段時間。我遇到過同樣的問題。在我的情況下,我沒有注意到一個子類具有與我試圖在父類中聲明的那個相同的選擇器的方法。 – 2012-09-04 23:07:22

+0

有我自己,也有些愚蠢:我用小寫字母而不是大寫字母發佈通知。他們區分大小寫! – 2015-01-06 08:40:56

回答

14

最可能的原因是你沒有實際調用addObserver:selector:name:object:。你沒有一條記錄線;你確定代碼正在運行嗎?

第二個最可能的原因是您在發佈通知之前致電removeObserver:。這是最常見的dealloc(如果您曾經觀察過任何情況,應該總是請致電removeObserver)。這裏的錯誤是您的觀察對象在通知之前已經釋放。

+0

你說得對,我創建了Interface Builder中觀察者的對象,它並沒有被任何東西保留。謝謝。 – indragie 2010-07-07 21:44:23

+0

我有同樣的問題。我在'init'方法中添加了觀察者而不是'initWithStyle' – testing 2010-11-01 19:13:15

+1

如果你使用IB來創建你的東西​​,那麼init可能不會被調用。取決於你想要做什麼,使用initWithCoder或awakeWithNib。 – futureelite7 2011-08-06 12:56:53