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...
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).
-init
(or -application:didFinishLaunchingWithOptions:
for the app delegate) and removeObserver in -dealloc
. This is easier than keeping track of how many times you've registered (if you addObserver twice, you get called twice each time the notification is posted, IIRC). –
Simplify 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
}
}
NotificationCenter.default.addObserver(self, selector: #selector(self.defaultsChanged), name: UserDefaults.didChangeNotification, object: nil)
–
Attenuate 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
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")
}
}
}
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")
}
}
}
Listen to change in settings
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];
Remember to remove the observer, once this view controller is no longer in memory.
In iOS10, try this:
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
// Your code here
}
© 2022 - 2024 — McMap. All rights reserved.