为WKWebView添加UIRefreshControl后下拉无刷新指示器,求解决
问题:WKWebView添加UIRefreshControl后下拉刷新指示器不显示?
我是Swift和iOS开发新手,基于ios-pwa-wrap仓库代码开发WebView应用,想要为WKWebView添加下拉刷新功能。参考教程后在代码中添加了UIRefreshControl,但下拉页面时刷新指示器不显示,附上相关代码,请问遗漏了什么?
func createWebView(container: UIView, WKSMH: WKScriptMessageHandler, WKND: WKNavigationDelegate, NSO: NSObject, VC: ViewController) -> WKWebView{ let config = WKWebViewConfiguration() let webView = WKWebView(frame: calcWebviewFrame(webviewView: container, toolbarView: nil), configuration: config) webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] webView.isHidden = true; webView.navigationDelegate = WKND; webView.scrollView.bounces = true; return webView } extension ViewController: WKUIDelegate { func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if (navigationAction.targetFrame == nil) { let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: #selector(refreshWebView(_:)), for: UIControl.Event.valueChanged) webView.scrollView.addSubview(refreshControl) webView.load(navigationAction.request) } return nil } @objc func refreshWebView(_ sender: UIRefreshControl) { print("triggered reload"); MyProject.webView?.reload() sender.endRefreshing() } }
问题分析与解决方案
核心问题:刷新控件添加位置错误
你把UIRefreshControl加到了createWebViewWith方法中,但这个方法仅在WKWebView处理新窗口导航(比如页面中的_blank链接)时才会触发,而你的主WebView是在createWebView方法里创建的,这个核心WebView根本没有绑定刷新控件,自然下拉时不会显示指示器。
修正步骤
- 在主WebView创建时添加刷新控件
修改createWebView方法,在创建WebView后直接初始化并绑定UIRefreshControl,推荐使用scrollView.refreshControl属性(iOS 10+支持),而非addSubview,这样系统能正确处理控件的布局和交互逻辑:
func createWebView(container: UIView, WKSMH: WKScriptMessageHandler, WKND: WKNavigationDelegate, NSO: NSObject, VC: ViewController) -> WKWebView{ let config = WKWebViewConfiguration() let webView = WKWebView(frame: calcWebviewFrame(webviewView: container, toolbarView: nil), configuration: config) webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] webView.isHidden = true; webView.navigationDelegate = WKND; webView.scrollView.bounces = true; // 初始化并绑定下拉刷新控件 let refreshControl = UIRefreshControl() refreshControl.addTarget(VC, action: #selector(VC.refreshWebView(_:)), for: .valueChanged) webView.scrollView.refreshControl = refreshControl return webView }
- 清理无效代码
删除createWebViewWith方法中添加刷新控件的代码,该方法仅用于处理新窗口导航逻辑,不需要在这里绑定刷新控件:
extension ViewController: WKUIDelegate { func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame == nil { webView.load(navigationAction.request) } return nil } @objc func refreshWebView(_ sender: UIRefreshControl) { print("triggered reload"); MyProject.webView?.reload() sender.endRefreshing() } }
- 额外检查项
- 确认
MyProject.webView确实引用了当前创建的主WebView,否则reload()调用会无效 - 确保WebView的
scrollView.bounces保持为true(你已设置),这是触发下拉刷新的必要条件
内容的提问来源于stack exchange,提问作者Whip
相关产品推荐
相关产品推荐

