如何检查 WkWebView 是否在 Objective-C 完成加载?

How to check if WkWebView finish loading in Objective-C?

我想使用 WkWebView 加载 HTML 页面,我想在页面加载完成后立即显示该页面。只要它正在加载,我就想在空视图上显示一个 activity 指示器。 我创建了两个视图一个 loadingView 和一个 wkWebView。在加载页面时,我将 loadingView 添加到 VC 作为子视图,然后我想删除 loadingView 并添加 wkWebView。这是我的代码:

    [self addSubview:_loadingView];
    _wkWebView = [[WKWebView alloc] initWithFrame:self.frame];
    _wkWebView.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);

    //Send a request to wkUrlconnection
    NSURL *wkUrl = [NSURL URLWithString:self.wkUrlString];
    NSURLRequest *wkRequest = [NSURLRequest requestWithURL:wkUrl];

    //Here I want to check if it's loaded and then remove loadingView and add wkWebView
    [_wkWebView loadRequest:wkRequest];
    [self.loadingView removeFromSuperview];
    [self addSubview:_wkWebView];

谁能告诉我如何在加载时进行检查,如果完成刷新 VC?谢谢你的回答。

我认为 WKNavigationDelegatewebView:didFinishNavigation: 委托回调正是您要找的。

在您开始加载时配置并显示您的 activity 指示器,然后在调用回调时停止并将其从视图中移除。

对于swift 4.2:

func webView(_ webView: WKWebView,
                 didFinish navigation: WKNavigation!){
        print("loaded")
}

一定要在 didLoad(或类似的)中为 webView 设置委托

webView.navigationDelegate = self

对于遇到网页包含多个框架并因此进行多次加载会中断加载动画的问题的任何人,我已经实施了以下内容并且它适用于我目前遇到的所有情况:

Swift:

var loadCount: Int = 0

override func viewDidLoad() {
    super.viewDidLoad()

    startLoading()
    webview.navigationDelegate = self
    let request = URLRequest(url: url)
    webview.load(request)
}

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    loadCount += 1
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    loadCount -= 1

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
        if self?.loadCount == 0 {
            self?.stopLoading()
        }
    }

}

基本思路是在请求 url 之前启动加载动画,然后对每个请求进行计数,仅在请求计数 == 0 时才停止加载动画。延迟,因为我发现一些帧同步地排队请求,因此下一个加载将在 0.1 秒延迟完成之前开始。

(͡°͜ʖ͡°)

class WebViewVC: UIViewController {
    
    // MARK: IBOutlets
    @IBOutlet weak var webView: WKWebView!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
    
    // MARK: Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        
        webView.navigationDelegate = self
        loadWebsite()
    }
}

// MARK: WKWebView
extension WebViewVC: WKNavigationDelegate {
    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        activityIndicator.startAnimating()
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        activityIndicator.stopAnimating()
    }
}

// MARK: Private methods
extension WebViewVC {
    private func loadWebsite() {
        guard let url = URL(string: "google.com") else { return }
        
        let urlRequest = URLRequest(url: url)
        webView.load(urlRequest)
    }
}