在视图是 UIScrollview 的子视图的 UIViewController 中未收到 NSNotification

Posted

技术标签:

【中文标题】在视图是 UIScrollview 的子视图的 UIViewController 中未收到 NSNotification【英文标题】:NSNotification not being received in a UIViewController whose view is a subview of a UIScrollview 【发布时间】:2011-02-18 15:30:50 【问题描述】:

我正在尝试将 myViewController 订阅到自定义 NSNotification。视图层次结构如下所示:


window
   - rootViewController.view
      - scrollView
          - myViewController.view

通知正在从 rootViewController 视图内的按钮发送到 [NSNotificationCenter defaultCenter]。 rootViewController 监听通知并响应它就好了。

我在 myViewController 中有完全相同的“监听”代码,但由于某种原因它没有收到通知。如果它是应用程序的一部分,它应该会收到通知,对吗?我在 myViewController 的 initWithNibName 方法中有一条调试消息,所以我知道它正在订阅通知。我什至尝试通过将通知名称设置为 nil 来让 myViewController 监听所有通知。例如:


NSLog(@"main view controller initialized");

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarVisibilityChanged:) name:nil object:nil];

但那里也没有运气。有没有人看到过这样的事情发生在 NSNotifications 上?

有什么想法吗?

谢谢!

【问题讨论】:

name:object: 都设置为nil 通常会使您选择的接收所有 通知,这真的是您想要的吗?另外,你确定注册和发送都是在同一个线程上完成的吗? 为什么你把 UIViewController 放在你的 scrollView 里面而不是 UIView ? 你的对象上真的有statusBarVisibilityChanged: 方法吗?仔细检查拼写错误。 @Benj:他正在将 UIViewController 的视图放在滚动视图中。 @DarkDust 通知注册和观察不依赖线程。 【参考方案1】:

我猜视图控制器已被释放。以编程方式创建视图控制器时不保留视图控制器是一个常见错误。

【讨论】:

把支票交给你,因为你先回答了——这就是问题所在。我猜 VIEW 还活着,因为它有一个超级视图……但 myViewController 本身没有。出于某种原因,我假设如果 viewController 的视图在周围,它也会使控制器保持活动状态。谢谢!【参考方案2】:

如果您确定观察设置正确,我对未收到任何通知的唯一解释是,控制器在发送任何通知之前已被释放。

NSNotification 机制既不依赖于视图层次结构,也不依赖于线程。如果你有一个(活的)对象被设置为观察者,它肯定会收到通知。

【讨论】:

以上是关于在视图是 UIScrollview 的子视图的 UIViewController 中未收到 NSNotification的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 弄乱了它的子视图

缩放嵌套在 UIScrollView 中的子视图

向 UIScrollView 添加多个子视图

记录 UIScrollView 的子视图会显示未添加的子视图

在Scroll View的高度动画后,UIScrollView的子视图不响应触摸

如何使用 XIB 的子视图实现 UIScrollView