2013-03-06 51 views
-1

我試圖讓NSNotifications工作。在這一刻,沒有成功。NSNotification失敗....爲什麼?

在我appDelegate.m文件我有:

[[NSNotificationCenter defaultCenter] postNotificationName:@"first" object:nil]; 

在我mainViewController.m,在viewDidLoad方法我有

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

並建立了一個方法(在mainViewController.m以及):

-(void) firstRun:(NSNotification *) notification 
{ 
     NSLog(@"This works!"); 
} 

但是,運行應用程序時,在日誌中沒有看到任何輸出。

我的代碼有什麼問題?請指教。

+0

Adri,如果您有時間,請點擊下面答案旁邊的複選標記,以便將此問題標記爲已回答並被視爲已關閉。 – 2013-04-09 21:23:34

+0

@Mike完成!謝謝你提醒我。 – A3O 2013-04-10 07:36:56

回答

1

上面的答案,其中指出,你曾使用過的觀測方法的錯誤選擇,肯定是有問題。

您應該檢查的另一件事是您在發佈通知之前添加觀察者。通知是同步的。發佈後,他們只會被已註冊的觀察員識別。

我建議您在發佈通知的行上設置斷點,並在添加觀察者的行上設置斷點,然後查看哪些行爲先被命中。

+0

我不明白,請解釋一下。我在哪裏以及如何測試它?說我的ViewDidLoad必須在appDelegate.m中的applicationDidFinishLaunchingWithOptions之前在mainViewController.m中調用是否正確?這是正常的行爲嗎? – A3O 2013-03-06 14:42:52

+1

要測試它,您可以使用Xcode在模擬器中運行代碼。如果您訪問視圖控制器的.view屬性或在應用程序中調用[mainViewController視圖]:didFinishLaunchingWithOptions:在發佈通知之前,這會導致您的視圖控制器調用viewDidLoad方法,然後再發布通知。 – 2013-03-06 14:43:50

+0

感謝您的回覆。通過設置兩個斷點,我知道postNotification在觀察者獲取之前被「加載」。這不會工作(我認爲) – A3O 2013-03-06 14:59:58

5

錯誤的選擇,應該是:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(firstRun:)name:@"first" object:nil]; 
+0

編輯問題,它必須先運行。在我的問題中是錯字。在我的代碼中是正確的。沒有改變 - >在NSLog中沒有輸出。 – A3O 2013-03-06 14:39:14

+1

@AdriOosterwijk你錯過了這裏的關鍵細節。您需要在firstRun之後添加冒號(:),比如'firstRun:',因爲您有一個參數可以通過選擇器。 – 2013-03-06 14:49:29

+0

@ 0x7ffffff和馬克,我瞭解到,觀察員必須在崗位調用之前加載。在​​我的情況下,它是相反的。我想我必須重做一些想法才能完成這一切。謝謝您的回覆。 – A3O 2013-03-06 15:05:23