2012-11-24 108 views
0

我一直試圖讓NSNotification工作。對於測試,我想要一個使用storyBoards加載新viewController的按鈕。當你點擊按鈕時,它應該觸發appObserver在第二個ViewController(我已經命名爲Page2)中的通知。在Page2中,NSNotificationCenter應該啓動一個方法(myMethod :)並打印出一個簡單的NSLog。 不幸的是,它不起作用,因爲myMethod沒有被調用。我究竟做錯了什麼 ???NS通知不起作用

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (IBAction)goToPage2Button:(id)sender { 

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

} 

#import "Page2.h" 

@interface Page2() 

@end 


@implementation Page2 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(myMethod:) name:@"test" object:nil]; 


    } 
    return self; 
} 

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


    if ([[notification name] isEqualToString:@"test"]) 
     NSLog (@"Successfully received the test notification!"); 


} 

回答

1

我想這可能是因爲你的page2視圖控制器在觸發通知時不存在。

第二個視圖控制器從它的筆尖中喚醒時註冊觀察,但如果它尚未創建,則它尚未註冊第一個視圖控制器正在發送的通知。

你應該做的是使用segues根據動作加載視圖控制器。

+0

@Abizem - 感謝您讓我走向正確的方向。我剛剛學會了如何使用segues傳遞數據,並且它工作得非常出色。 – pete

4

當您使用故事板時,通常不會調用initWithNibName。它使用initWithCoder。你確定你已經開始添加你的觀察者嗎?

如果您曾經看到某行代碼沒有被調用,那麼將斷點或NSLog放在一起並確認它是確實如此。

+0

好的,'awakeFromNib'也是一個可行的方法來定製。 – Abizern

+1

@Rob - 感謝羅布 - 你是對的。觀察者在initWithNibName中根本沒有被調用。目前,我通過使用Aabizems關於Segues的建議更改了我的應用程序。 – pete

+0

是的,如果使用故事板,'prepareForSegue'是將數據從一個segue的'sourceController'傳遞到'destinationController'的最好方法。如果你想從目標控制器傳遞東西回到源控制器,使用'delegate'或引用目的地的'presentViewController'是有道理的。但是,當使用多個視圖控制器共享數據時(例如,您有一些異步後臺作業,從遠程服務器檢索數據,並且想讓任何視圖控制器當前正在運行以使下載完成),「UINotificationCenter」是完美的。 – Rob