Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I want to load HTML pages using WkWebView and I want to show the page just after it's finished loading. As long as it's loading I would like to show an activity indicator on an empty View. I create two view a loadingView and a wkWebView. While the page is loading I add to VC as subview the loadingView and after I want to remove loadingView and add wkWebView. Here is my code:

    [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]; 

Can someone show me how to check while it's loading and if finish refresh the VC? Thank you for your answers.

like image 276
faklyasgy Avatar asked Mar 30 '16 15:03

faklyasgy


People also ask

How do I know if WKWebView finished loading Swift?

To check if your WKWebView has loaded easily implement the following method: import WebKit import UIKit class ViewController: UIViewController, WKNavigationDelegate { let webView = WKWebView() func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

How can I clear the contents of a UIWebView WKWebView?

To clear old contents of webview With UIWebView you would use UIWebViewDelegate 's - webViewDidFinishLoad: .

How do I import WKWebView into Objective C?

You can implement WKWebView in Objective-C, here is simple example to initiate a WKWebView : WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; WKWebView *webView = [[WKWebView alloc] initWithFrame:self. view. frame configuration:theConfiguration]; webView.


2 Answers

I think the WKNavigationDelegate's webView:didFinishNavigation: delegate callback is what you're looking for.

Configure and present your activity indicator when you start to load and then stop and remove it from view when the callback is called.

like image 198
Stavash Avatar answered Oct 09 '22 03:10

Stavash


For anyone who is experiencing the issue of a webpage containing multiple frames and therefore doing multiple loads which interrups your load animation, I have implemented the following and it works for me in all the situations I have come across so far:

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

The basic idea is to start your load animation before you request the url, then count each request being made and only stop the load animation when your request count == 0. This is done after a slight delay as I find that some frames queue up requests synchronously so the next load will begin before the 0.1 second delay has completed.

( ͡° ͜ʖ ͡°)

like image 21
Nick Kirsten Avatar answered Oct 09 '22 04:10

Nick Kirsten