【发布时间】:2020-02-25 15:53:27
【问题描述】:
如何在 Swift 中将观察者添加到通知中心?
这样做:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(ReloadData), name: NSNotification.Name(rawValue: "ReloadData"), object: nil)
}
@objc func ReloadData(notification: NSNotification) {
// func
print ("FUNC TEST")
}
但是每次控制器关闭/打开(在标签栏的标签之间切换)时,都会添加一个新的侦听器。 当我打电话时
print ("Call Notif")
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ReloadData"), object: nil)
"func ReloadData" 被多次调用。控制台:
Call Notif
FUNC TEST
FUNC TEST
将再次在标签栏的标签之间切换。
Call Notif
FUNC TEST
FUNC TEST
FUNC TEST
我怎么能只答应你一次?
【问题讨论】:
-
通过
NotificationCenter.default.removeObserver(self)取消订阅viewWillDisappear方法并订阅viewWillAppear。 This is actually a duplicate question -
阿列克谢,是的!但我需要观察者留下来。我不希望它被删除。我想要一份。
-
虽然上面的评论解决了您的问题的可见部分,但真正的问题是 您在内存中加载了该控制器的多个实例。所以你应该明白为什么会发生这种情况。这肯定是内存泄漏/糟糕的设计。
-
你订阅了你的 viewControllers 超类中的通知吗?因为 UITableViewController 的控制器只创建一次(viewDidLoad 在创建时被调用一次)并且在它们的父级(tabbarcontroller)被释放时被释放。
标签: ios swift notificationcenter