iOS Swift用户默认值Observer错误消息已收到但未处理

时间:2017-02-26 09:08:05

标签: ios swift swift3 nsuserdefaults

我正在尝试在用户默认更改后调用函数。以下是我正在使用的代码。

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:收到邮件但未处理。

基本上,当密钥arrayAarrayB发生变更时,我希望它能够拨打filterItems()self.tableView.reloadData()。它也可以在任何用户默认值更改时调用那些,但效率会降低。

2 个答案:

答案 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()
        }