Swift 3 - проверьте, загружена ли WKWebView страница

Мой вопрос: как проверить, полностью ли загружена страница в WKWebView в Xcode с помощью Swift 3?

Это моя проблема:

Веб-страница 1: На этой странице я загружаю веб-страницу 2

Веб-страница 2: Мне нужно получить html-данные с веб-страницы 2, но когда я печатаю данные HTML, я получаю HTML-данные на веб-странице 1, чего я не хочу. Но когда я печатаю данные HTML через 2 секунды, он дает мне правильные данные HTML.

Мне нужно знать, закончила ли страница в WKWebView загрузку. Я могу видеть, что в WebView он загружен, а также панель прогресса полностью загружена, но когда я печатаю html-данные страницы, я получаю html-данные предыдущей страницы, чего я не хочу. Только если я подожду секунду, он даст правильные данные, вероятно, приведет к загрузке веб-страницы 2.

Итак, как мне позволить Xcode печатать html, когда следующая страница полностью загружена?

Я пробовал несколько методов:

Возможно, я могу использовать:

если webView.isloading {get}, но я не знаю, как реализовать этот метод, и если он будет работать. Я попробовал несколько методов из Stack, но они не работают для меня или устарели.

Вы, ребята, знаете решение этой проблемы в Swift 3? Спасибо!

Ответ 1

Ответ (Большое спасибо @paulvs)

Чтобы проверить, легко ли загружен ваш WKWebView, используйте следующий метод:

import WebKit
import UIKit


class ViewController: UIViewController, WKNavigationDelegate {


  let webView = WKWebView()


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

  override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "https://www.yourwebsite.com/") !
    let request = URLRequest(url: url)
    webView.navigationDelegate = self
    webView.load(request)


    // Do any additional setup after loading the view, typically from a nib.
  }

}
  1. Добавить WKNavigationDelegate в класс
  2. Добавлять:

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

Результат: он будет печатать "загружен" в консоли каждый раз, когда WKWebView завершит загрузку страницы. Это было именно то, что я искал, так что еще раз большое спасибо Paulvs!

Ответ 2

Установить делегат> WKNavigationDelegate

Objective-C

// Start loading WKWebView
-(void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
    NSLog(@"Start loading");
} 

//Finished loading WKWebView
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"End loading");
}

Swift 4.2

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    print("Start loading")    
}

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