2014-10-28 85 views
8

我创建了appGroups,并且使用该组设置了NSUserDefaults。我有一个观察者,当值被改变时它不会被触发。使用suiteName检测NSUserDefaults上的更改

let defaults = NSUserDefaults(suiteName: "group.daniesy.text")!    
defaults.addObserver(self, forKeyPath: "temp", options: NSKeyValueObservingOptions.New, context: nil) 
defaults.setBool(!defaults.boolForKey("temp"), forKey: "temp") 
defaults.synchronize() 

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

但是,如果我忽略appGroup并使用NSUserDefaults.standardUserDefaults()它按预期工作。 任何想法为什么它不工作?

+0

yes,weird ... forKeyPath观察员它不适用于suiteName;唯一的解决办法是观察员“全局”所有的NSUserDefault:NSNotificationCenter.defaultCenter()。addObserver(self,selector:“defaultsChanged_selector”,名称:NSUserDefaultsDidChangeNotification,object:nil) – TonyMkenu 2014-10-28 10:10:10

+0

当外部更改nsuser默认值时,这样做会工作吗?像从一个小部件或其他应用程序? – 2014-10-28 13:40:20

+0

它的工作,你也可以检查这个例子 - http://www.glimsoft.com/06/28/ios-8-today-extension-tutorial/(PS Hello Cluj!:D) – TonyMkenu 2014-10-28 14:30:37

回答

0

尝试添加suitename而不是初始化。设置一个应用程序组,如果你想共享的数据

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.addSuiteNamed("group.daniesy.text") 
defaults.addObserver(self, forKeyPath: "temp", options: NSKeyValueObservingOptions.New, context: nil) 
defaults.setBool(!defaults.boolForKey("temp"), forKey: "temp") 
defaults.synchronize() 

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