2013-04-30 63 views
0

這是我第一次嘗試NSNotification,嘗試了幾個教程,但不知何故,它不工作。發送一個NSNotification之間的意見

基本上我發送一個字典到B類彈出子視圖(UIViewController)和測試是否已收到。

任何人都可以告訴我我做錯了什麼?

A類

- (IBAction)selectRoutine:(id)sender { 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

    NSDictionary *dictionary = [NSDictionary dictionaryWithObject:@"Right" 
                  forKey:@"Orientation"]; 
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"PassData" 
    object:nil 
    userInfo:dictionary]; 

    createExercisePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createExercisePopupView"]; 

    //Tell the operating system the CreateRoutine view controller 
    //is becoming a child: 
    [self addChildViewController:popupController]; 

    //add the target frame to self's view: 
    [self.view addSubview:popupController.view]; 

    //Tell the operating system the view controller has moved: 
    [popupController didMoveToParentViewController:self]; 

} 

B類

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

- (void)receiveData:(NSNotification *)notification { 
    NSLog(@"Data received: %@", [[notification userInfo] valueForKey:@"Orientation"]); 
} 
+2

在A級發送通知之前是否裝有B類? – bandejapaisa 2013-04-30 19:37:23

+0

不,它尚未加載。那就是我需要將通知移到加載後的位置。正確回答,以便將其標記爲已回答。謝謝 – 2013-04-30 19:38:52

+1

移動'[[NSNotificationCenter defaultCenter] postNotificationName:@「PassData」 object:nil userInfo:dictionary];'創建B類後 – andreagiavatto 2013-04-30 19:39:31

回答

5

如果還沒有註冊,以接收該通知,但 - 它永遠不會接受它。通知不會持續。如果沒有註冊的監聽者,則發佈的通知將會丟失。

3

針對您的問題,接收方在發送通知之前尚未開始觀察,因此通知會丟失。

更一般地說:你做錯了什麼是使用這個用例的通知。如果你只是玩耍和試驗,那很好,但是你在這裏建模的那種關係最好通過直接保留對視圖和調用方法的引用來實現。如果實驗對其實際使用的情況是現實的,那麼通常是最好的。

你應該知道的3個基本的通信機制,以及何時使用它們:

通知 使用它們,通知出事了其他不明物體。當你不知道誰想要回應事件時使用它們。當多個不同的對象想要響應事件時使用它們。

通常情況下,觀察者的大部分生命期都被註冊。確保觀察員在銷燬之前從NSNotificationCenter中刪除自己很重要。

代表團當一個對象要來自未知源獲取數據,或通過一些決定一個未知的「顧問」責任 使用委派。

方法 當您知道目標對象是誰,他們需要什麼以及什麼時候需要它們時,可以使用直接調用。

+1

您錯過了您的清單中的KVO。 – bandejapaisa 2013-05-01 05:39:36