如何确定iOS上的设置更改时间

Ben*_*Ben 25 iphone settings plist ios

我使用root.plistiPhone 的标准方法创建了一个自定义的Settings.app包.我想知道是否有办法确定用户何时在我的应用中更改这些设置...

Emi*_*mil 40

您可以使用以下方法收听NSUSerDefaultsDidChange-notifications:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
Run Code Online (Sandbox Code Playgroud)

每当NSUserDefaults发生变化时,defaultsChanged都会被调用.

[[NSNotificationCenter defaultCenter] removeObserver:self];当你想要停止监听这些通知时,不要忘记打电话(当对象被取消分配时你也应该这样做).

  • +1.通常你会在`-init`(或`-application:didFinishLaunchingWithOptions:`代表app)中添加addObserver,并在`-dealloc`中删除removeObserver.这比跟踪您注册的次数要容易得多(如果您两次添加浏览器,每次发布通知时都会被调用两次,IIRC). (4认同)
  • @Ben没有真正的方法可以确定哪些设置已更改,但如果您查找特定的内容,请尝试在运行通知时存储旧版本,然后在下次检查时进行检查. (3认同)
  • 哇可爱,我只是想通了,如果你调用同步一旦它不起作用但调用它两次它确实有效.得那么爱 (3认同)

Jos*_*eph 13

语法适用于Swift 2.使用Swift,您可以执行以下操作来订阅NSUserDefaults的更改:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "defaultsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

然后创建如下方法:

func defaultsChanged(notification:NSNotification){
    if let defaults = notification.object as? NSUserDefaults {
       //get the value for key here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Swift 3的语法:`NotificationCenter.default.addObserver(self,selector:#selector(self.defaultsChanged),name:UserDefaults.didChangeNotification,object:nil)` (4认同)

Kri*_*kel 8

注册接收NSUserDefaultsDidChangeNotification通知.这并不明显,但iOS应用程序编程指南将其描述为:

应用程序通过"设置"应用程序公开的首选项已更改


Saz*_*han 8

快速 4

在 viewController 中注册观察者,

NotificationCenter.default.addObserver(self, selector: #selector(settingChanged(notification:)), name: UserDefaults.didChangeNotification, object: nil)
Run Code Online (Sandbox Code Playgroud)

选择器实现

 @objc func settingChanged(notification: NSNotification) {
    if let defaults = notification.object as? UserDefaults {
        if defaults.bool(forKey: "enabled_preference") {
            print("enabled_preference set to ON")
        }
        else {
            print("enabled_preference set to OFF")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)