web-dev-qa-db-fra.com

Swift 3 - Vérifiez si WKWebView a chargé la page

Ma question : Comment puis-je vérifier si une page de WKWebView est entièrement chargée dans Xcode à l'aide de Swift 3?

C'est mon problème:

Page Web 1: Depuis cette page, je charge la page Web 2

Page Web 2: Je dois obtenir les données HTML de la page Web 2, mais lorsque j'imprime les données HTML, je reçois les données HTML de la page Web 1, ce que je ne souhaite pas. Mais lorsque j'imprime les données HTML 2 secondes plus tard, les bonnes données HTML me sont fournies.

J'ai besoin de savoir si une page de WKWebView a effectivement été chargée. Je peux voir dans la vue Web qu'il est chargé et que la barre de progression est entièrement chargée, mais lorsque j'imprime les données html de la page, j'obtiens les données html de la page précédente, ce qui n'est pas ce que je veux. Si j'attends une seconde, les bonnes données sont fournies, probablement parce que la page Web 2 est chargée.

Alors, comment puis-je laisser Xcode imprimer du code HTML lorsque la page suivante est totalement chargée?

J'ai essayé plusieurs méthodes:

Peut-être que je peux utiliser:

si webView.isloading {get} mais je ne sais pas comment implémenter cette méthode et si cela devrait fonctionner. J'ai essayé plusieurs méthodes de Stack mais celles-ci ne fonctionnent pas ou sont obsolètes.

Connaissez-vous une solution à ce problème dans Swift 3? Merci!

21
Stef

Réponse (grand merci à @paulvs)

Pour vérifier si votre WKWebView a été chargé facilement, appliquez la méthode suivante:

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. Ajouter WKNavigationDelegate à la classe
  2. Ajouter:

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

Résultat: Le message "chargé" dans la console sera imprimé chaque fois que le WKWebView aura fini de charger la page. C’était exactement ce que je recherchais, donc encore un grand merci à Paulvs!

42
Stef

Définir le délégué> 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")
}
5
Sunil Targe