我有一个自定义 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/