Селектор UIButton не работает после нажатия кнопки в WKWebView - PullRequest
0 голосов
/ 28 мая 2019

У меня есть собственный titleView с 2 пользовательскими кнопками UIB с изображениями стрелок, которые позволяют перейти к следующему контроллеру представления в структуре подкачки. Они прекрасно работают, пока кнопка не будет нажата в WKWebView. Тогда они больше не работают и селектор не вызывается. Обратите внимание, что другие кнопки в панели навигации по-прежнему работают (UIBarButtonItems). Кнопки снова работают правильно после того, как пользователь переходит к следующему контроллеру представления.

После просмотра этого, похоже, что WKCompositingView становится первым респондентом, и если я переопределяю становлениеFirstResponder () в подклассе WKWebView, проблема исчезнет. Я все еще немного сбит с толку, и хотел бы понять суть проблемы.

class NonFirstRespondableWebView: WKWebView {

    override func becomeFirstResponder() -> Bool {
        return false
    }
}

Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 28 мая 2019

Большинство элементов пользовательского интерфейса в swift имеют UIResponder. Необработанные события передаются по цепочке респондента во вложенные представления. Я предполагаю, что WKWebView поглощает все сенсорные события, как только окно стало активным. Вы можете узнать больше о цепочке респондента здесь

Относительно первого респондента. Из документов:

Первый респондент обычно является первым объектом в цепочке респондента, получившим сообщение о событии или действии. В большинстве случаев первым респондентом является объект просмотра, который пользователь выбирает или активирует с помощью мыши или клавиатуры.

Если вы хотите сохранить интерактивность с полнофункциональным WKWebView (например, вам нужно вызвать клавиатуру или что-то в этом роде), вы можете использовать

webView.resignFirstResponder()

В любое время подать в отставку.

В противном случае расширение, которое даст вам ту же функциональность, может выглядеть примерно так:

extension WKWebView {

    open override func becomeFirstResponder() -> Bool {
        if self.superview?.superview is UIWebView {
            return false
        } else {
            return super.becomeFirstResponder()
        }
    }

}
...