gpt4 book ai didi

ios - 在扩展中添加和删除 Notification Observer

转载 作者:搜寻专家 更新时间:2023-11-01 06:12:29 25 4
gpt4 key购买 nike

我有一个 UILabel 扩展以及要在其中添加和删除自定义 NSNotification 的内容。

public extension UILabel {

@IBInspectable var localizedText: String? {

get { return text }
set {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: LCLLanguageChangeNotification), object: nil)
NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: LCLLanguageChangeNotification), object: nil, queue: .main) { [weak self] (notification) in
guard let strongSelf = self else {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: LCLLanguageChangeNotification), object: nil)
return
}
strongSelf.text = strongSelf.localizedText?.localized()
}
text = newValue?.localized()
}
}
}

我在这个解决方案中看到的问题是当

self

为 nil,无法移除观察者,因此即使 UILabel 从 UIWindow 堆栈中移除,此通知也会触发。

有解决办法吗?

最佳答案

根据 zizoft 提到的 Apple Docs:

If your app targets iOS 9.0 and later or macOS 10.11 and later, you don't need to unregister an observer in its dealloc method.

这是非常阴暗的,因为用户已经体验到它并非适用于所有情况。 This is one example

这位博主发现,如果您有一个 selector 引用,它只会自动删除。因此,您不能拥有一个开放的 block 。相反,我会像这样创建它:

extension UILabel {

func addStuff() {
NotificationCenter.default.addObserver(self, selector: #selector(doStuff), name: NSNotification.Name(rawValue: LCLLanguageChangeNotification), object: nil)
}

@objc func doStuff() {

}
}

主题是我会使用比您更好的名称处理程序,看看Here它会更干净:

关于ios - 在扩展中添加和删除 Notification Observer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52496546/

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