WKWebView首次加载时页面按钮无障碍焦点丢失如何解决
WKWebView页面加载完成后自动获取无障碍焦点解决方案
核心修改逻辑
- 控制器需要遵守
WKNavigationDelegate协议,监听页面加载完成回调 - 页面加载完成后发送无障碍布局变更通知,主动触发VoiceOver将焦点切换到WKWebView内容区域
完整修改后代码
import WebKit class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { // 新增遵守WKNavigationDelegate协议 var myWebView: WKWebView! // 改为全局属性避免局部变量被释放 override func viewDidLoad() { super.viewDidLoad() myWebView = WKWebView(frame: CGRect(x:0, y:0, width: UIScreen.main.bounds.width, height:UIScreen.main.bounds.height)) myWebView.uiDelegate = self myWebView.navigationDelegate = self // 绑定导航代理 self.view.addSubview(myWebView) let myURL = URL(string: "https://www.apple.com") let myURLRequest:URLRequest = URLRequest(url: myURL!) myWebView.load(myURLRequest) } // 页面加载完成回调 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // 短延迟等待网页内容完全渲染、无障碍节点生成完成 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { // 发送无障碍布局变更通知,指定焦点落到webView内容区域 UIAccessibility.post(notification: .layoutChanged, argument: webView) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
可选优化方案
如果需要精准定位到网页内的特定按钮/元素获取焦点,可以在发送无障碍通知前,调用JS触发目标元素的聚焦逻辑:
// 替换#targetButton为实际网页元素的选择器 webView.evaluateJavaScript("document.querySelector('#targetButton').focus()", completionHandler: nil)
延迟时长可根据实际网页加载速度调整,大部分场景0.1-0.3秒即可满足需求。
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

