Я создал пользовательский пакет Settings.app, используя стандартный подход root.plist
для iPhone. Мне интересно, есть ли способ определить, когда пользователь изменяет эти настройки в моем приложении...
Как определить, когда настройки меняются на iOS
Ответ 1
Вы можете прослушивать уведомления NSUSerDefaultsDidChange с помощью этого:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
Всякий раз, когда NSUserDefaults изменяется, вызывается defaultsChanged
.
Не забудьте вызвать [[NSNotificationCenter defaultCenter] removeObserver:self];
, если вы хотите прекратить прослушивание этих уведомлений (вы также должны сделать это, когда объект будет освобожден).
Ответ 2
Синтаксис для 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
}
}
Ответ 3
Зарегистрируйтесь, чтобы получать уведомления NSUserDefaultsDidChangeNotification
. Это не очевидно, но Руководство по программированию приложений iOS описывает это так:
Настройки, предоставляемые вашим приложением через приложение "Настройки", изменены
Ответ 4
Пример доступа к настройке типа Bool для приложения с ключом "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")
}
}
}
Ответ 5
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")
}
}
}
Ответ 6
Слушайте изменение настроек
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];
Не забудьте удалить наблюдателя, как только этот контроллер просмотра больше не находится в памяти.
Ответ 7
В iOS10 попробуйте следующее:
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
// Your code here
}