web-dev-qa-db-ja.com

WkWebViewがObjective-Cでの読み込みを完了したかどうかを確認する方法は?

WkWebViewを使用してHTMLページをロードし、ロードが完了した直後にページを表示したい。読み込み中であれば、空のビューにアクティビティインジケーターを表示したいと思います。 loadingViewとwkWebViewの2つのビューを作成します。ページの読み込み中に、loadViewのサブビューとして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の更新が完了したら、教えてください。ご回答ありがとうございます。

29
faklyasgy

WKNavigationDelegateの-​​ webView:didFinishNavigation: デリゲートコールバックが探しているものだと思います。

コールバックが呼び出されたときに、ロードを開始するときにアクティビティインジケーターを構成して表示し、その後、表示から停止して削除します。

52
Stavash

for Swift 4.2:

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

didLoad(または同様の)でwebViewのデリゲートを設定してください

webView.navigationDelegate = self
5
ingconti

複数のフレームを含むWebページの問題を経験しているため、ロードアニメーションを中断する複数のロードを実行している人のために、以下を実装しました。これまでに遭遇したすべての状況で動作します。

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

基本的な考え方は、URLをリクエストする前にロードアニメーションを開始し、作成されている各リクエストをカウントし、リクエストカウント== 0の場合にのみロードアニメーションを停止することです。 0.1秒の遅延が完了する前に次のロードが開始されるように同期的に要求します。

(͡°͜ʖ͡°)

4
Nick Kirsten