How to determine when Settings change on iOS
Solution 1
You can listen for NSUSerDefaultsDidChange-notifications with this:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
Whenever the NSUserDefaults changes, defaultsChanged
will be called.
Don't forget to call [[NSNotificationCenter defaultCenter] removeObserver:self];
when you want to stop listening for these notifications (you should also do this when object gets deallocated).
Solution 2
The syntax is for Swift 2. Using Swift you would do something like this to subscribe to changes for the NSUserDefaults :
NSNotificationCenter.defaultCenter().addObserver(self, selector: "defaultsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil)
Then create the method like this :
func defaultsChanged(notification:NSNotification){
if let defaults = notification.object as? NSUserDefaults {
//get the value for key here
}
}
Solution 3
Register to receive NSUserDefaultsDidChangeNotification
notifications. It's not obvious, but the iOS Application Programming Guide describes it as such:
Preferences that your application exposes through the Settings application are changed
Solution 4
SWIFT 4
Register observer in viewController,
NotificationCenter.default.addObserver(self, selector: #selector(settingChanged(notification:)), name: UserDefaults.didChangeNotification, object: nil)
Selector implementation
@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")
}
}
}
Solution 5
An example accessing an app specific Bool type setting with key "instantWeb":
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")
}
}
}
Comments
-
Ben about 4 years
I have created a custom Settings.app bundle using the standard
root.plist
approach for the iPhone. I'm wondering if there's a way to determine when the user changes those settings in my app...