我有一个带有2个带有箭头图像的自定义UIButton的自定义titleView,这些UIButton允许导航到分页结构中的下一个视图控制器。它们工作得非常好,直到在WKWebView中点击一个按钮为止。然后它们不再起作用,并且不调用选择器。请注意,导航栏中的其他按钮仍然可以使用(UIBarButtonItems)。用户滑动到下一个视图控制器后,按钮将再次正常工作。
研究了一些内容之后,它看起来像是WKCompositingView成为了第一响应者,如果我在WKWebView子类中重写了成为firstFirstResponder(),问题就消失了。不过,我还是有些困惑,想了解问题的根源。
class NonFirstRespondableWebView: WKWebView {
override func becomeFirstResponder() -> Bool {
return false
}
}
有人对为什么会这样有任何见识吗?
答案 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()
}
}
}