gpt4 book ai didi

swift - 从不同的 ViewController 中删除 NSNotification Observer

转载 作者:行者123 更新时间:2023-11-30 11:16:29 25 4
gpt4 key购买 nike

我有一个观察者,我在一个类中注册如下:

class ViewControllerA: UIViewController {

//create shared class reference
var sharedClassReference_A = SharedClass()


//initialize Notification Observer and store observer reference in sharedClass
override func viewDidLoad() {
super.viewDidLoad()

var observerHandler: Any? = nil

observerHandler = NotificationCenter.default.addObserver(self, selector: #selector(ViewControllerA.appDidTerminate(_:)), name: .UIApplicationWillTerminate, object: nil)

self.sharedClassReference_A.sharedHandler = observerHandler

}

//perform some action when a notification is received
@objc func appDidTerminate(_ notification: NSNotification) {

//perform some action

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueA_X" {
let destinationController = segue.destination as! ViewControllerX
destinationController.sharedClassReference_X = self.sharedClassReference_A
}
}

}

我将观察者的引用存储在共享类中:

class SharedClass {

var sharedHandler: Any? = nil

}

一旦到达不同的 View Controller ,我就会尝试删除观察者,如下所示:

class ViewControllerX: UIViewController {

var sharedClassReference_X = SharedClass()

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)

//Attempt to remove observer registered in ViewControllerA
if let observerHandler = self.sharedClassReference_X.sharedHandler {
NotificationCenter.default.removeObserver(observerHandler)
}
}

}

我知道使用这种方法删除观察者是失败的,因为观察者在 ViewControllerX 被释放后被调用。

我的问题是:如何成功初始化一个类 (ViewControllerA) 中的观察者并能够稍后在不同的类 (ViewControllerX) 中删除它?

最佳答案

我认为最好遵循在 viewDidLoad/viewWillAppear 中设置观察者并在 deinit/ 中删除它们的一般准则viewDidDisappear 分别根据您的情况,如下

NotificationCenter.default.addObserver(self, selector: #selector(ViewControllerA.appDidTerminate(_:)), name: .UIApplicationWillTerminate, object: nil)

返回无效

//

class ViewControllerX: UIViewController { 
var aRef:ViewControllerA!
}

在prepareForSegue

destinationController.aRef = self

然后使用

NotificationCenter.default.removeObserver(aRef, name: NSNotification.Name.UIApplicationWillTerminate, object: nil)

关于swift - 从不同的 ViewController 中删除 NSNotification Observer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51697628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com