【问题标题】:Multiple NSNotifications received in parent UIViewController在父 UIViewController 中收到多个 NSNotification
【发布时间】:2016-06-06 13:31:54
【问题描述】:

我有一个父 UIViewController BaseViewController 用于某些视图:

class TestViewController: BaseViewController { ...

我想在BaseViewController 中收到通知,所以我在其ViewWillAppear 中添加了一个观察者:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(BaseViewController.receivedNotification(_:)), name:"NotificationIdentifier", object: nil)

我无法删除 ViewWillDisappear 上的观察者,因为通知是从呈现的 UIViewController 发送的,可以呈现在每个 UIViewController 上,父 BaseViewController 所以 BaseViewController 总是消失。

因此,在浏览应用程序后,添加了多个观察者,并且我多次收到通知。

我应该怎么做才能只执行一次通知选择器?或者当另一个UIViewController被推送时如何.removeObserver(但出现时不要删除)?

【问题讨论】:

    标签: ios swift nsnotificationcenter nsnotifications


    【解决方案1】:

    你可以很好地使用:

    NSNotificationCenter.defaultCenter().removeObserver(observer: <The class from which you want to remove>, name: "Name of notification which you want to remove", object: nil)
    

    【讨论】:

      【解决方案2】:

      我无法删除 ViewWillDisappear 上的观察者,因为通知是从呈现的 UIViewController 发送的,该通知可以呈现在父级为 BaseViewController 的每个 UIViewController 上,因此 BaseViewController 总是消失。

      你绝对可以。每个将在屏幕上显示的新ViewController 都有自己的实例,因此它自己的BaseViewController 副本。事实上,目前只能出现BaseViewController 的一份副本(如果我们谈论的是全屏视图控制器)

      【讨论】:

      • 是的。但是当我展示 UIViewController 时,所有观察者都被删除并且没有收到通知。呈现的 UIViewController 是密码,它的父级不是 BaseViewController。
      • @Roo 你没有从BaseViewController继承UIViewController
      • 没有。呈现UIViewController 父级不同。
      • @Roo 如果是,则将其子类化。或者在你推送之前移除观察者,或者在prepareForSegue(_:sender:)
      • @Roo 顺便说一句,我发现你的架构很奇怪。通常你不需要在消失的控制器中捕获通知。任何视图控制器都应该能够通过获取viewWillAppear 调用来刷新数据/UI。只有出现的控制器无法在运行时检查更改并需要通知。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多