【问题标题】:Call function when if value in NSUserDefaults.standardUserDefaults() changes当 NSUserDefaults.standardUserDefaults() 中的值改变时调用函数
【发布时间】:2016-04-13 20:12:01
【问题描述】:

我有一个从 NSUserDefaults.standardUserDefaults() 变成值的变量

var GiftCount = NSUserDefaults.standardUserDefaults().valueForKey("Gift") as! Int

我有一个名为 setGiftCount() 的函数...

当变量 GiftCount 发生变化时我需要调用这个函数...怎么做?

【问题讨论】:

  • 只需为 NSUserDefaultsDidChangeNotification 添加观察者
  • Btw NSUserDefaults 有一个名为 integerForKey 的方法
  • 请告诉我为 NSUserDefaultsDidChangeNotification 添加观察者
  • 对于那些被@LeoDabus 的回复迷路的人,从 Swift3/iOS 10 开始,它现在是 UserDefaults.didChangeNotification。
  • 这里是如何在 Swift 中将 KVO 与 UserDefaults 一起使用的答案:stackoverflow.com/a/54889233/1418981

标签: swift variables swift2 nsuserdefaults


【解决方案1】:

第一

NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "Gift", options: NSKeyValueObservingOptions.New, context: nil)

第二

deinit {
    NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "Gift")
}

第三

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    setGiftCount()
}

【讨论】:

  • 如果自己或子类观察到任何其他情况,这将导致意外行为。您应该指定一个 context 并在其上进行分支。
  • @BenKennedy 你能告诉我在哪里可以了解这种行为,以及如何正确使用context?我正在查看这些文档,但我认为它缺少您拥有的任何上下文。 developer.apple.com/documentation/objectivec/nsobject/…
  • @salem:NSHipster 有一篇关于 KVO 的好文章,并举例说明了如何定义一个唯一的 context 值:nshipster.com/key-value-observing/#correct-context-declarations 它已经有几年历史了,早于 Swift,但是方法上面的例子中使用的是相同的(Obj-C),所以context是密切相关的。
  • 这看起来和我要找的完全一样。谢谢@BenKennedy!
【解决方案2】:

您可以将 NSUserDefaultsDidChangeNotification 的观察者添加到您的视图控制器:

添加:

NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)

删除它:

NotificationCenter.default.removeObserver(self, name: UserDefaults.didChangeNotification, object: nil)

并添加选择器方法:

func userDefaultsDidChange(_ notification: Notification) {
    // your code...   setGiftCount()
}

【讨论】:

  • 这里的困难是你不知道哪个值发生了变化,只有其中一个发生了变化。通知中也没有传递userInfo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多