2013-08-18 56 views
0

我有一個UIViewController這是不響應NSNotifications。我確信通知所啓動的行動是有效的。我的設置有什麼問題?UIViewController沒有響應NSNotifications

我使用一個singleton從AppDelegatedidFinishLaunching加載feedViewController。此feedViewController保留對deckViewController的引用,並且此deckViewController可靠地發送feedViewController應該遵守的通知。但通知從未收到。我確信singleton對應該接收通知的視圖控制器保持強有力的參考。

在保存於該通知觀察者的引用singleton

// .h file 
@property (nonatomic) ROFeedViewController *feedViewController; 

// .m file 
_feedViewController = [[ROFeedViewController alloc] init]; 
    IIViewDeckController *deckController = [[IIViewDeckController alloc] initWithCenterViewController:_feedViewController leftViewController:leftController rightViewController:rightController]; 
    _feedViewController.deckController = deckController; 

在通知觀察者(ROFeedViewControler):

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDeckPanned:) name:@"ViewDeckPanned" object:_deckController]; 
    ... 
} 

- (void)viewDeckPanned:(NSNotification *)notification { 
    float offset = [(NSNumber *)[notification object] floatValue]; 
    if (offset > 0) { 
     _leftButton.transform = CGAffineTransformMakeRotation(offset * M_PI/180.0); 
    } else { 
     _rightButton.transform = CGAffineTransformMakeRotation(offset * M_PI/180.0); 
    } 
} 

通知可靠獲得從通知發送者(IIViewDeckController)發送:

- (void)notifyDidChangeOffset:(CGFloat)offset orientation:(IIViewDeckOffsetOrientation)orientation panning:(BOOL)panning { 
    [self performDelegate:@selector(viewDeckController:didChangeOffset:orientation:panning:) offset:offset orientation:orientation panning:panning]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDeckPanned" object:[NSNumber numberWithFloat:offset]]; 

}

回答

2

您設置:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDeckPanned:) name:@"ViewDeckPanned" object:_deckController]; 

這意味着你正在聽的名字「ViewDeckPanned」從 _deckController來的通知(因爲對象:參數應該定義通知發件人) 。

但是,這同時,您發佈通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDeckPanned" object:[NSNumber numberWithFloat:offset]]; 

,你告訴[NSNumber的numberWithFloat:偏移]是發送者。由於_deckControllerNSNumber的實例彼此不匹配,因此您的觀察者中沒有通知信息。

簡單的變化將通過nilobject:參數(在兩個地方 - 在其中添加觀察者,並在您發佈通知),如果你想傳遞的NSNumber與通知一起,然後創建一個包含其用戶信息字典。