我使用iPhone的标准root.plist
方法创建了一个自定义的Settings.app软件包。我想知道是否有办法确定用户何时在我的应用程序中更改这些设置...
答案 0 :(得分:39)
您可以使用以下方式收听NSUSerDefaultsDidChange通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
每当NSUserDefaults发生变化时,都会调用defaultsChanged
。
当您想要停止侦听这些通知时,不要忘记调用[[NSNotificationCenter defaultCenter] removeObserver:self];
(当对象被取消分配时,您也应该这样做。)
答案 1 :(得分:11)
语法适用于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
}
}
答案 2 :(得分:7)
注册接收NSUserDefaultsDidChangeNotification
次通知。这不是显而易见的,但iOS Application Programming Guide将其描述为:
您的应用程序的首选项 通过设置公开 申请被更改
答案 3 :(得分:2)
使用键“instantWeb”访问特定于应用程序的Bool类型设置的示例:
func observeUserDefaults(notification: NSNotification) {
print("Settings changed")
if let defaults = notification.object as? NSUserDefaults {
if defaults.valueForKey("instantWeb") as! Bool==true {
print("Instant Web ON")
}
}
}
答案 4 :(得分:2)
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")
}
}
}
答案 5 :(得分:1)
收听设置中的更改
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];
一旦此视图控制器不再在内存中,请记住删除观察者。
答案 6 :(得分:-1)
在iOS10中,试试这个:
{
"A":{
"name":"Ram",
"gender":"male",
"designation":"engineer"
},
"B":{
"name":"Shyam",
"gender":"male",
"designation":"student"
},
"C":{
"name":"Mohan",
"gender":"male",
"designation":"manager"
}
}