【问题标题】:remove observers from all VC - swift从所有 VC 中删除观察者 - swift
【发布时间】:2019-08-28 10:51:11
【问题描述】:

在示例中:在A vc 我添加了观察者:

NotificationCenter.default.addObserver(self, selector: #selector(onDidReceive(_:)), name: .didReceive, object: nil)

当我在B vc 中时,我可以删除A vc 中的观察者吗?

我试过这个(B vc):

NotificationCenter.default.removeObserver(self)

但是没用

有可能吗?或者我必须在我创建的同一个 VC 中删除观察者?

【问题讨论】:

  • self in B is B,因此它永远无法删除 A。您需要将 A vc 实例存储在某处,然后调用 .removeObserver(aInstance)
  • 在 BVC 中,self 不是 AVC 实例。在viewDidAppear() 中做addObserver() 和在viewDidDisappear() 中的removeObserver() 怎么样?
  • @Larme 也许他不想删除AVCviewDidDisappear 中的观察者,并希望在执行某些操作后从BVC 中删除观察者
  • @Gereon 类似这样的东西(在 B VC 中):let main = UIStoryboard(name: "A", bundle: nil) let viewcontroller = main.instantiateViewController(withIdentifier: "AVC") NotificationCenter.default.removeObserver(viewcontroller) ?
  • @alexking 否。您正在创建AVC 的新实例。您应该获得AVC 的现有实例

标签: swift


【解决方案1】:

您可以从导航控制器的视图控制器属性中获取AVC 的实例并移除观察者。

//BVC

if let vc = self.navigationController?.viewControllers.first(where: { $0 is AVC }) {
    NotificationCenter.default.removeObserver(vc)
}

【讨论】:

    【解决方案2】:

    只需在添加观察者的 viewController 中添加一条线

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    

    这将删除观察者

    【讨论】:

    • stackoverflow.com/a/40339926/10687271 从 iOS 9(和 OS X 10.11)开始,如果你不使用基于块的观察者,你不需要自己移除观察者。系统会为你做这件事,因为它会尽可能地为观察者使用归零弱引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多