UserDefaults.didChangeNotification不触发

时间:2018-07-04 09:46:17

标签: ios swift notifications userdefaults

我正在处理的项目具有将数据写入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()

}

2 个答案:

答案 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)即可解决。