Попытка удалить незарегистрированного наблюдателя UserDefaults Swift - PullRequest
0 голосов
/ 27 января 2020

Я новичок в программировании на Swift и iOS, так что извините за недостаток знаний ...

У меня есть контроллер TabBar, и один из контроллеров представления вкладок регистрирует наблюдателя в его viewDidLoad() метод, подобный этому:

UserDefaults.standard.addObserver(self, forKeyPath: "interests", options: .new, context: nil)

Я пытаюсь удалить наблюдателя в методе deinit(), например:

UserDefaults.standard.removeObserver(self, forKeyPath: "interests")

Однако, если я раньше не заходил на эту вкладку, я получаю эту ошибку: Cannot remove an observer for the key path "interests" because it is not registered as an observer.

Я понимаю, что если я не go во вкладку viewDidLoad() не будет вызван, но я не знаю лучшего места для добавления наблюдателя. Я не получаю эту ошибку, если я вошел в этот контроллер представления. Можете ли вы сказать мне, если есть лучшее место для этого или я делаю что-то еще неправильно? Спасибо.

РЕДАКТИРОВАТЬ Вот мой полный просмотр контроллера

class InterestsViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        UserDefaults.standard.addObserver(self, forKeyPath: "interests", options: .new, context: nil)
    }

    deinit {
        UserDefaults.standard.removeObserver(self, forKeyPath: "interests")
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        // updating the UI
    }
}

1 Ответ

1 голос
/ 27 января 2020

Из документов:

https://developer.apple.com/documentation/foundation/notificationcenter/1413994-removeobserver

Если ваше приложение настроено на iOS 9.0 и более поздние версии или macOS 10.11 и более поздние версии, вам не нужно отмените регистрацию в методе deallo c.

, если ваше приложение настроено ниже iOS 9.0, вы можете вызвать / отменить регистрацию для viewWillAppear и viewWillDisappear

...