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

标签 ios swift wkwebview uiresponder

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

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

class NonFirstRespondableWebView: WKWebView {

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

有人知道为什么会发生这种情况吗?

最佳答案

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

关于第一响应者。来自文档:

The first responder is usually the first object in a responder chain to receive an event or action message. In most cases, the first responder is a view object that the user selects or activates with the mouse or keyboard.

假设您想保持与 WKWebView 功能齐全的交互性(例如,您需要调出键盘或其他东西),您可以使用

webView.resignFirstResponder()

随时辞职响应者。

否则,为您提供相同功能的扩展可能如下所示:

extension WKWebView {

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

}

关于ios - 在 WKWebView 中点击按钮后 UIButton 选择器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56332558/

相关文章:

ios - 定期以后台模式 (iOS) 发送 HTTP 请求

ios - 更新 Angular cordova-ios 平台后,IPA 中出现空白屏幕

ios - 即使 useWebKit 设置为 true 也使用 UIWebView 进行博览会

swift - 如何以编程方式滚动 iOS WKWebView,swift 4

ios - ARKit Swift 中未检测到 SCNNode 之间的碰撞

ios - WatchOS 2.2 的 NSURLSession 非常慢

ios - 展开可选值线程 :1 bad instruction 时意外发现 nil

ios - 具有自调整单元格的 Interface Builder 行高

ios - 将 ZIPArchive for iOS 添加到 xcode 时如何修复 'unknown type name' 错误

ios - Swift UI 生命周期 : how to replace the current view with a new one ? 不只是简单地推送它