【问题标题】:UIButton selector not working after button tapped within WKWebView在 WKWebView 中点击按钮后 UIButton 选择器不起作用
【发布时间】:2019-10-13 09:54:14
【问题描述】:

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

经过一番调查,看起来 WKCompositingView 成为了第一响应者,如果我在 WKWebView 子类中覆盖 becomeFirstResponder(),问题就会消失。不过我还是有点困惑,想了解问题的根源。

class NonFirstRespondableWebView: WKWebView {

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

有人知道为什么会这样吗?

【问题讨论】:

    标签: ios swift wkwebview uiresponder


    【解决方案1】:

    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()
            }
        }
    
    }
    

    【讨论】:

    • 感谢您的回答!我仍然不明白为什么其他导航栏按钮仍然可以使用。而且我也不明白为什么首先会发生这种情况 - 在 WKWebView 中点击的按钮没有调出键盘(实际上,任何点击的按钮都会导致按钮被禁用)。
    • 当您在 WKWebView 中点击时,任何网站的窗口都会变为活动状态。 webView 旁边的任何同级视图都没有响应,因为 WKWebView 然后具有触摸事件的第一响应者。导航栏按钮不会受此影响,因为它们位于响应者链的更远位置(可能它们是您的根视图)。
    猜你喜欢
    • 2016-10-31
    • 2018-06-22
    • 2021-06-18
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多