UIViewController 没有响应 NSNotifications

Posted

技术标签:

【中文标题】UIViewController 没有响应 NSNotifications【英文标题】:UIViewController not responding to NSNotifications 【发布时间】:2013-08-18 20:18:58 【问题描述】:

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

我使用单例从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]];

【问题讨论】:

【参考方案1】:

你设置:

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

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

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

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

你告诉 [NSNumber numberWithFloat:offset] 是一个发送者。由于 _deckControllerNSNumber 的实例不匹配,因此您不会在观察者中收到通知信息。

简单的更改是将nil 作为object: 参数传递(在这两个地方 - 添加观察者的地方和发布通知的地方),如果你想将 NSNumber 与通知一起传递,那么创建 userInfo 字典包含它。

【讨论】:

以上是关于UIViewController 没有响应 NSNotifications的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController 内的 UITableView 没有响应(Swift 3.0)

成为没有动画的第一响应者

UIViewController 没有将触摸传递给其他视图

UIViewController 可能不响应 showRootPopoverButtonItem

UIViewController 不响应旋转功能

为啥我的 UIViewController 不在其视图的响应者链中?