Делегат iOS WKWebView.scrollView вызывает BAD_ACCESS

Мой viewController имеет свойство UIView, которое содержит WKWebView. И я установил делегат WKWebView scrollView для моего viewController, который является общедоступной функцией моего подкласса UIView и вызывается в моем viewController.

Проблема в том, что когда я вызываю [viewController popViewControllerAnimated], он вылетает на [UIScrollView setDelegate:]. Я решил проблему, добавив viewController.UIView.WKWebView.scrollView.delegate = nil; в dealloc viewController.

Но почему? Dealloc WKWebView находится после dealloc viewController, я полагаю, что viewController установлен в nil, а dealloc в WKWebView обновит свой делегат до nil, а затем вызовет BAD_ACCESS? Но почему dealloc будет неявно вызывать setDelegate ???


person Tepmnthar    schedule 03.08.2016    source источник
comment
Не могли бы вы предоставить немного больше информации? Как вы добавили свой scrollView для просмотра? с сильной ссылкой или нет?   -  person iSashok    schedule 03.08.2016


Ответы (2)


В аналогичной ситуации для WKWebView у меня была аналогичная проблема с назначением делегата себе. Реализация deinit решена для меня:

deinit {
    webView.scrollView.delegate = nil
}
person Arvind    schedule 17.08.2017
comment
спасло мне день :-) Он работал на iOS ›9 и вылетал на iOS 9. Оказывается, Apple, должно быть, исправила это в iOS 10, так что делегат теперь хранится слабым, а не строкой раньше :-) - person alex da franca; 15.03.2018

Для ObjC установка делегата scrollView в nil в dealloc по-прежнему вызывала сбой. Пришлось обнулить делегата в didMoveToSuperview

- (void)didMoveToSuperview {
    if (self.superview == nil) {
        self.scrollView.delegate = nil;
    }
}

Эти темы мне помогли

https://github.com/readium/r2-navigator-swift/pull/4

https://bugs.webkit.org/show_bug.cgi?id=159980

person akshay1188    schedule 27.08.2018