我正在尝试在用户默认更改后调用函数。以下是我正在使用的代码。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//Watch user default changes
UserDefaults.standard.addObserver(self, forKeyPath: "arrayA", options: NSKeyValueObservingOptions.new, context: nil)
UserDefaults.standard.addObserver(self, forKeyPath: "arrayB", options: NSKeyValueObservingOptions.new, context: nil)
}
func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutableRawPointer) {
filterItems()
self.tableView.reloadData()
}
deinit {
UserDefaults.standard.removeObserver(self, forKeyPath: "arrayA")
UserDefaults.standard.removeObserver(self, forKeyPath: "arrayB")
}
该代码的灵感来自this。我已经为Swift 3修改了一下。
当执行会更新用户默认设置的操作时,应用程序崩溃并将以下内容打印到控制台。
-observeValueForKeyPath:ofObject:change:context:收到邮件但未处理。
基本上,当密钥arrayA
或arrayB
发生变更时,我希望它能够拨打filterItems()
和self.tableView.reloadData()
。它也可以在任何用户默认值更改时调用那些,但效率会降低。
答案 0 :(得分:0)
您使用了错误的方法。尝试将其替换为:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
filterItems()
self.tableView.reloadData()
}
请注意关键字override
。因为observeValue(forKeyPath:of:change:context:)
是从NSObject
继承的方法。如果你在没有它的情况下写下func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutableRawPointer)
并且编译器没有抱怨,那就表明你输错了。
答案 1 :(得分:0)
/**
this func is not the kvo func,
first : there is no "override" keyword.
second: in swift3.0, the name is not correct。 it should be
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print(change)
}
*/
func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutableRawPointer) {
filterItems()
self.tableView.reloadData()
}