在视图是 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 的子视图会显示未添加的子视图