Ошибка класса Swift WKWebView был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы с ним

У меня проблема с удалением наблюдателя из моего viewController с именем «myBrowser». У меня есть панель ProgressView, вот код, в который я добавляю наблюдателя:

 webView!.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)

в этом контроллере у меня есть кнопка, которая позволяет мне вернуться к другому контроллеру:

@IBAction func disa(sender: UIBarButtonItem) {

self.navigationController?.popViewControllerAnimated(true)

}

если я добавлю

webView?.removeObserver(self, forKeyPath: "estimatedProgress")

внутри disa func, мое приложение вылетает из-за того, что «WKWebView был освобожден, в то время как наблюдатели значений ключа все еще были зарегистрированы с ним»… я попытался поместить removeObserver в viewDidDisapper, в viewWillDisappear, но мое приложение все еще аварийно завершает работу, если я нажимаю кнопку до того, как панель progressView полностью загружена .

Как я могу решить эту проблему?


person Swift1    schedule 22.12.2015    source источник


Ответы (1)


Удалить наблюдателя в методе deinit

deinit {
    webView!.removeObserver(self, forKeyPath: "estimatedProgress")
}
person nsinvocation    schedule 22.12.2015
comment
я использую Swift... куда я должен поместить код, который вы разместили? если я поставлю его в метод deinit, мое приложение все равно вылетит - person Swift1; 23.12.2015
comment
Да такая же ошибка. Ошибка возникает, когда пользователь нажимает кнопку disa до того, как панель ProgressView полностью загрузится. (внутри функции наблюдать ValueforKeyPath я помещал этот код: если webView? - person Swift1; 23.12.2015
comment
удалите этот оператор if и оставьте его только в deinit() - person nsinvocation; 23.12.2015
comment
Готово... все та же ошибка! я не знаю что делать! - person Swift1; 23.12.2015
comment
можете ли вы показать полный код вашего контроллера представления или, по крайней мере, весь код, где вы используете веб-просмотр - person nsinvocation; 23.12.2015
comment
Да, я публикую это, отвечая на мой вопрос - person Swift1; 23.12.2015
comment
опубликовано сейчас, пожалуйста, посмотрите его - person Swift1; 23.12.2015
comment
Вы можете попытаться поместить его в метод viewDidUnload, не будучи уверенным на 100%, есть ли он в Swift (я все еще использую Objective-C для пользовательского интерфейса), но это почти должно быть. - person Erik Terwan; 23.12.2015
comment
я пробовал... но если я пишу viewDidUnload, я получаю эту ошибку, помечен как недоступный метод :( - person Swift1; 23.12.2015
comment
Во-первых, удалите все операторы addObserver и оставьте один из viewDidLoad. Во-вторых, попробуйте использовать: webView!.removeObserver(self, forKeyPath: AssessmentProgress) , обратите внимание на 'webView!' он явно развернут, используйте его только в deinit() - person nsinvocation; 23.12.2015
comment
Или вы можете использовать #keyPath(WKWebView.estimatedProgress). Для меня это помогло: deinit { webView.removeObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress)) } - person Eimantas Kudarauskas; 23.01.2020