在WKWebView中点击按钮后,UIButton选择器不起作用

时间:2019-05-27 21:20:56

标签: ios swift wkwebview uiresponder

我有一个带有2个带有箭头图像的自定义UIButton的自定义titleView,这些UIButton允许导航到分页结构中的下一个视图控制器。它们工作得非常好,直到在WKWebView中点击一个按钮为止。然后它们不再起作用,并且不调用选择器。请注意,导航栏中的其他按钮仍然可以使用(UIBarButtonItems)。用户滑动到下一个视图控制器后,按钮将再次正常工作。

研究了一些内容之后,它看起来像是WKCompositingView成为了第一响应者,如果我在WKWebView子类中重写了成为firstFirstResponder(),问题就消失了。不过,我还是有些困惑,想了解问题的根源。

class NonFirstRespondableWebView: WKWebView {

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

有人对为什么会这样有任何见识吗?

1 个答案:

答案 0 :(得分:0)

swift中的大多数UI元素都有一个UIResponder。未处理的事件沿响应者链传递到封闭视图。我的猜测是,一旦窗口变为活动状态,WKWebView将吸收所有触摸事件。您可以了解有关响应者链here

的更多信息

关于第一响应者。从文档中:

  

第一响应者通常是响应者链中接收事件或操作消息的第一个对象。在大多数情况下,第一响应者是用户使用鼠标或键盘选择或激活的视图对象。

假设您想与WKWebView保持全功能的交互性(例如,您需要拿起键盘等),可以使用

webView.resignFirstResponder()

随时辞职。

否则,可以为您提供相同功能的扩展程序可能看起来像这样:

extension WKWebView {

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

}