2014-09-24 37 views
1

我试图将KVO添加到我的NSUserDefaults以观察设置中的值变化。我已经为我的observeValueForKeyPath:object:change:context方法添加了一个断点,但它从未被调用过。将KVO添加到设置包

这里是我的代码:

override init() { 
    super.init() 

    NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: UserWantsUbiquityPreferenceKey, options: NSKeyValueObservingOptions.New, context: nil) 
} 

override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafeMutablePointer<Void>) { 
    println("\(keyPath) changed to \(object)") 
} 

回答

2

下面的代码可以帮助你建立你的志愿:

import UIKit 

//observer's context 
private var defaultsContext = 0 

class ViewController: UIViewController { 

    let defaults = NSUserDefaults.standardUserDefaults() 


    @IBAction func changeDefaults(sender: AnyObject) { 
     //Toggle myPref value (true/false) 
     defaults.setBool(!defaults.boolForKey("myPref"), forKey: "myPref") 
     defaults.synchronize() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //Add observer 
     defaults.addObserver(self, forKeyPath: "myPref", options: NSKeyValueObservingOptions(), context: &defaultsContext) 
    } 

    //Observe changes 
    override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: [NSObject : AnyObject]!, context: UnsafeMutablePointer<Void>) { 
     if context == &defaultsContext { 
      seeUpdate() 
     } else { 
      super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     } 
    } 

    //React to changes 
    func seeUpdate() { 
     println(defaults.boolForKey("myPref")) 
    } 

    deinit { 
     //Remove observer 
     defaults.removeObserver(self, forKeyPath: "myPref", context: &defaultsContext) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 
+0

'的init(suiteName)'NSUserDefaults'的'初始化用于初始化'NSUserDefault'和done相同的代码,它甚至不执行设备中的'observeValueForKeyPath(...)'方法。你有什么想法吗? – Rafeek 2015-02-26 07:03:51

相关问题