Как определить, когда настройки меняются на iOS - PullRequest
24 голосов
/ 13 октября 2010

Я создал пользовательский пакет Settings.app, используя стандартный подход root.plist для iPhone. Мне интересно, есть ли способ определить, когда пользователь изменяет эти настройки в моем приложении ...

Ответы [ 7 ]

39 голосов
/ 14 октября 2010

Вы можете прослушивать NSUSerDefaultsDidChange-уведомления с этим:

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

Всякий раз, когда изменяется NSUserDefaults, будет вызываться defaultsChanged.

Не забудьте позвонить [[NSNotificationCenter defaultCenter] removeObserver:self];, когда вы хотите прекратить прослушивание этих уведомлений (вы должны также делать это, когда объект освобождается).

11 голосов
/ 15 ноября 2015

Синтаксис для 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
    }
}
7 голосов
/ 13 октября 2010

Зарегистрируйтесь, чтобы получать NSUserDefaultsDidChangeNotification уведомлений.Это не очевидно, но Руководство по программированию приложений для iOS описывает его так:

Изменены настройки, которые ваше приложение предоставляет через приложение «Настройки»

2 голосов
/ 20 марта 2018

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")
        }
    }
}
2 голосов
/ 23 ноября 2015

Пример доступа к настройке типа 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")
        }
    }
}
1 голос
/ 22 мая 2015

Прослушайте изменения в настройках

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

Не забудьте удалить наблюдателя, как только этот контроллер представления больше не будет в памяти.

0 голосов
/ 22 июня 2017

В iOS10 попробуйте это:

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