Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何确定iOS上的设置何时更改_Iphone_Ios_Settings_Plist - Fatal编程技术网

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

Iphone 如何确定iOS上的设置何时更改,iphone,ios,settings,plist,Iphone,Ios,Settings,Plist,我使用iPhone的标准root.plist方法创建了一个自定义Settings.app包。我想知道是否有办法确定用户何时在我的应用程序中更改这些设置…注册以接收通知。这并不明显,但报告中这样描述: 应用程序所需的首选项 通过设置曝光 申请表已更改 您可以使用以下命令侦听NSUserDefaultsIDChange通知: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChange

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

注册以接收通知。这并不明显,但报告中这样描述:

应用程序所需的首选项 通过设置曝光 申请表已更改


您可以使用以下命令侦听NSUserDefaultsIDChange通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
每当NSUserDefaults发生更改时,将调用
defaultsChanged


不要忘记调用
[[NSNotificationCenter defaultCenter]removeObserver:self]当您要停止侦听这些通知时(当对象被解除分配时也应执行此操作)。

侦听设置中的更改

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];

一旦此视图控制器不再位于内存中,请记住删除观察者。

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

NSNotificationCenter.defaultCenter().addObserver(self, selector: "defaultsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil)
然后创建如下方法:

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

使用“instantWeb”键访问特定于应用程序的布尔类型设置的示例:

在iOS10中,尝试以下操作:

UNUserNotificationCenter.current().getNotificationSettings { (settings) in
    // Your code here
}

SWIFT 4

在viewController中注册观察者

NotificationCenter.default.addObserver(self, selector: #selector(settingChanged(notification:)), name: UserDefaults.didChangeNotification, object: nil)
选择器实现

 @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")
        }
    }
}

啊,好吧,有道理。现在我的下一个问题是,如何确定哪些设置已更改?+1。通常,您需要在
-init
中添加Observer(或
-application:didFinishLaunchingWithOptions:
用于应用程序代理),并在
-dealloc
中删除Observer。这比跟踪你注册了多少次要容易得多(如果你添加了两次Observer,那么每次发布通知时都会被调用两次,IIRC)。@Ben没有真正的方法来确定哪些设置被更改,但是如果你查找特定的内容,请在运行通知时尝试存储旧版本,下次再检查一下。现在我遇到了另一个问题。以下是我的流程:1)登录应用程序(导致加载和复制设置(以便稍后比较更改)2)退出应用程序,进入设置,更改设置3)返回我的应用程序,检查设置并与旧设置进行比较,但即使在对standardUserSettings对象调用“同步”后,也不会注意到新设置。哇,很可爱,我刚刚发现,如果你调用synchronize一次,它就不起作用了,但是调用它两次,它就起作用了。我很喜欢Swift 3的语法:
NotificationCenter.default.addObserver(self,selector:#selector(self.defaultsChanged),name:UserDefaults.didChangeNotification,object:nil)
有没有一种优雅的方法可以在不到50行的代码中观察设置的变化,并用KVO处理按键数组?
 @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")
        }
    }
}