2017-02-26 4 views
0

ユーザーデフォルトの変更後に関数を呼び出そうとしています。以下は私が使用しているコードです。iOS Swift User Defaults Observerエラーメッセージが受信されましたが、処理されませんでした。

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:変更:コンテキスト:メッセージは受信されましたが、処理されませんでした。キーarrayAまたはarrayBが変更された場合

は基本的に私はそれが filterItems()self.tableView.reloadData()呼びたいです。また、ユーザーのデフォルト設定の変更を呼び出すこともできますが、効率が悪くなります。

+0

observeValueForKeyPathに@objc宣言が必要だと思います。 –

+0

'@ objc func observeValueForKeyPath'を使用すると同じエラーが発生します。あなたが何を意味するのか分からない限り。 –

+0

あなたは確信していますか? (NSKeyValueChangeKey:Any)?、コンテキスト:UnsafeMutableRawPointer?){ print(変更) } – Xingou

答えて

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)を書き留めると、コンパイラはそれに不平を言っていない、それはあなたが間違って入力した兆候です。

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() 
     } 
関連する問題