我有一个UIViewController没有响应NSNotifications。我确定通知启动的操作有效。我的设置有什么问题?

我使用单例从feedViewControllerAppDelegate加载didFinishLaunching。此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]];


}

最佳答案

您设置:

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


这意味着您正在侦听来自_deckController的名称“ ViewDeckPanned”的通知(因为object:参数应该定义了通知发送方)。

但是,与此同时,您发布了通知:

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


并且您说[NSNumber numberWithFloat:offset]是发送者。由于_deckControllerNSNumber实例彼此不匹配,因此在观察者中不会收到任何通知信息。

简单的更改是将nil作为object:参数传递(在两个地方-添加观察者和张贴通知的位置),如果要与通知一起传递NSNumber,则创建包含它的userInfo字典。

关于ios - UIViewController不响应NSNotifications,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18303254/

10-10 17:55
查看更多