web-dev-qa-db-fra.com

Comment vérifier si WkWebView a terminé son chargement dans Objective-C?

Je souhaite charger des pages HTML à l'aide de WkWebView et afficher la page juste après le chargement. Tant qu'il est en cours de chargement, j'aimerais afficher un indicateur d'activité sur une vue vide. Je crée deux vues une loadingView et une wkWebView. Pendant le chargement de la page, j'ajoute à VC comme sous-vue le loadingView et après je veux supprimer loadingView et ajouter wkWebView. Voici mon 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];

Quelqu'un peut-il me montrer comment vérifier pendant le chargement et si le rafraîchissement est terminé? Merci pour vos réponses.

26
faklyasgy

Je pense que le webView: didFinishNavigation: du WKNavigationDelegate '_ est le choix que vous recherchez.

Configurez et présentez votre indicateur d'activité lorsque vous commencez à charger, puis arrêtez-le et supprimez-le lorsque le rappel est appelé.

47
Stavash

pour Swift 4.2:

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

assurez-vous de définir délégué pour webView dans didLoad (ou similaire)

webView.navigationDelegate = self
2
ingconti

Pour tous ceux qui rencontrent le problème d'une page Web contenant plusieurs images et faisant donc plusieurs charges qui interrompent votre animation de charge, j'ai implémenté ce qui suit et cela fonctionne pour moi dans toutes les situations que j'ai rencontrées jusqu'à présent:

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

L'idée de base est de commencer votre animation de chargement avant de demander l'URL, puis de compter chaque demande et de ne l'arrêter que lorsque votre demande compte == 0. Ceci est fait après un léger retard, car je constate que certaines images sont en file d'attente. demande de manière synchrone pour que le prochain chargement commence avant la fin du délai de 0,1 seconde. 

(° ͜ʖ °)

0
Nick Kirsten