Какао - Уведомление об изменении значения NSUserDefaults? - PullRequest
51 голосов
/ 17 июля 2009

Допустим, у меня есть ключ @ "MyPreference" с соответствующим значением, сохраненным через NSUserDefaults.

Есть ли способ уведомления при изменении значения?

Или это может быть сделано через привязки? (Но в этом случае вместо привязки значения к элементу пользовательского интерфейса я хочу, чтобы мой объект был уведомлен об изменении, чтобы я мог выполнять другие задачи.)

Мне известно, что NSUserDefaultsDidChangeNotification можно наблюдать, но это, похоже, подход "все или ничего", и, похоже, там нет механизма, чтобы добраться до определенной пары ключ-значение, которая была изменена. (Не стесняйтесь исправлять.)

Ответы [ 4 ]

79 голосов
/ 17 июля 2009

Потратил весь день на поиски ответа, но нашел его через 10 минут после того, как задал вопрос ...

Наткнулся на решение через Key-Value-Observing:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:@"values.MyPreference"
    options:NSKeyValueObservingOptionNew
    context:NULL];

Или, проще (на комментарий ниже):

[[NSUserDefaults standardUserDefaults] addObserver:self
                                        forKeyPath:@"MyPreference"
                                           options:NSKeyValueObservingOptionNew
                                           context:NULL];
18 голосов
/ 28 июня 2015

Swift:

override func viewDidLoad() {
  super.viewDidLoad()
  NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
  // your logic
}

deinit {
  NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
9 голосов
/ 23 августа 2010

И сотруднику Apple рекомендуется использовать уведомление NSUserDefaultsDidChangeNotification здесь: https://devforums.apple.com/message/237718#237718

0 голосов
/ 26 января 2017

Я согласен с @DenNukem. Я использовал NSKeyValueObservingOptionNew. Но эта функция начала выдавать мне ошибку BADACCESS Code = 1, где бы я ни использовал NSUserdefault для сохранения других объектов. Если вы используете Key Value Observer, просто помните о проблеме Zombie в NSUserDefaults.

Вот ссылка на решение: NSUserDefaults и KVO проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...