You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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根本没有绑定刷新控件,自然下拉时不会显示指示器。

修正步骤

  1. 在主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
}
  1. 清理无效代码
    删除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()
    }
}
  1. 额外检查项
  • 确认MyProject.webView确实引用了当前创建的主WebView,否则reload()调用会无效
  • 确保WebView的scrollView.bounces保持为true(你已设置),这是触发下拉刷新的必要条件

内容的提问来源于stack exchange,提问作者Whip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:53:12