我正在处理的项目具有将数据写入UserDefaults的扩展名。然后在包含的应用程序中,UI应该根据更改进行更新。问题是,除非屏幕来自背景,否则UserDefaults.didChangeNotification
不会被触发。可能是什么原因,有没有一种方法可以解决此问题,或者有另一种方法可以获取所需的更新?
写扩展中的数据:
let sharedUserDefaults = UserDefaults(suiteName: Common.UserDefaultsSuite)
var receivedNotifications = sharedUserDefaults?.array(forKey: Common.ReceivedNotifications)
if receivedNotifications != nil {
receivedNotifications?.append(aData)
} else {
receivedNotifications = [aData]
}
sharedUserDefaults?.set(receivedNotifications, forKey: Common.ReceivedNotifications)
在视图控制器中注册通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)
}
并使用更改后的用户默认设置(实际上未调用):
@objc func userDefaultsDidChange(_ notification: Notification) {
print("User defaults did change")
gatherReceivedNotifications()
}
答案 0 :(得分:1)
仍然不知道为什么其他方法不起作用,但是以下方法可行,因此是一种解决方案。按照建议的here,我执行了以下操作:
Calculator
然后实施override func viewDidLoad() {
super.viewDidLoad()
UserDefaults(suiteName: Common.UserDefaultsSuite)?.addObserver(self, forKeyPath: Common.ReceivedNotifications, options: .new, context: nil)
}
:
observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
仅当对密钥override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == Common.ReceivedNotifications {
gatherReceivedNotifications()
}
}
进行UserDefaults更改时,才会立即触发它。
答案 1 :(得分:0)
代码while:
是指没有参数的#selector(userDefaultsDidChange)
。
但是您定义了func userDefaultsDidChange()
,它只有一个参数。
下一步:
将func userDefaultsDidChange(_ notification: Notification)
更改为#selector(userDefaultsDidChange)
即可解决。