Search code examples
iosswift

Add pull to refresh to WKWebView


I'm trying to add pull to refresh to a webview app. I've seen some tutorials and many similar questions but my code is different and I'm not sure where to add the UIRefreshControl. When I say 'my code' its not really my code, rather taken from this repo

Here's my code:

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()
    }
}

I can pull on the page but the refresh indicator doesn't appear. What am I missing?

(I'm very new to swift and iOS programming)


Solution

  • Add these lines to viewDidload method

     override func viewDidLoad() {
            super.viewDidLoad()
            
            let refreshControl = UIRefreshControl()
            refreshControl.addTarget(self, action: #selector(refreshWebView(_:)), for: UIControl.Event.valueChanged)
            webView.scrollView.addSubview(refreshControl)
        }