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

fak*_*sgy 34 objective-c ios wkwebview wkwebviewconfiguration

我想使用WkWebView加载HTML页面,我想在加载完成后显示页面.只要它正在加载我想在空视图上显示活动指示器.我创建了两个视图,一个loadingView和一个wkWebView.当页面加载时我将VC添加为子视图loadingView,之后我想删除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];
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何在加载时检查,如果完成刷新VC?谢谢您的回答.

Sta*_*ash 56

我认为你WKNavigationDelegatewebView:didFinishNavigation:委托回调是你正在寻找的.

在开始加载时配置并显示活动指示符,然后在调用回调时停止并将其从视图中删除.

  • 对于多个帧,可以多次调用该方法,因此它不起作用 (4认同)
  • 谢谢.这是一个很好的解决方案,但让我纠正你.WkWebView没有WKWebViewDelegate.而不是那样,它有WKNavigationDelegate. (3认同)
  • webView:didFinishNavigation: 大部分时间都不会回电,它对我不起作用 (3认同)
  • 任何知道何时完全加载且不再调用方法的解决方案 (2认同)

Nic*_*ten 8

对于任何遇到包含多个框架的网页并因此进行多次加载(这会干扰您的加载动画)的问题的人,我已经实现了以下方法,并且该方法在迄今为止遇到的所有情况下都对我有用:

Swift 4.2:

var loadCount = 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) {
        if (self.loadCount == 0) {
            self.stopLoading()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

(?°???°)


ing*_*nti 6

快速4.2:

func webView(_ webView: WKWebView,
                 didFinish navigation: WKNavigation!){
        print("loaded")
}
Run Code Online (Sandbox Code Playgroud)

确保在didLoad(或类似方法)中为webView设置委托

webView.navigationDelegate = self
Run Code Online (Sandbox Code Playgroud)