web-dev-qa-db-fra.com

comment effacer le contenu d'une UIWebView / WKWebView?

J'ai une vue Web qui peut être parcourue à travers différentes URL. Lorsque je passe de l'un à l'autre, je veux que l'ancienne page Web disparaisse avant de charger la suivante. Comment puis-je le faire sans réallouer la vue Web?

Si j'essaie de [self.webView loadHTMLString:@"" baseURL:nil]; et charger mon URL dans la même fonction la page Web précédente reste toujours:

[self.webView loadHTMLString:@"" baseURL:nil];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.pageURL]];

EDIT: cela n'est apparemment pas assez clair pour vous. le code ci-dessous n'efface pas la vue Web, il affiche la page précédente jusqu'à ce que la nouvelle soit chargée:

- (void) startLoadOfNextURL:(NSURL*)url
{
    // clear:
    [self.webView loadHTMLString:@"" baseURL:nil]; //DOESNT WORK  

    // Load real next URL
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}
14
Halpo

Vous pouvez écrire le code ci-dessous pendant que votre contrôleur disparaît.

webView.load(URLRequest(url: URL(string:"about:blank")!))
12
Donal

Vous pouvez lui faire charger une page vierge

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
8
ogres

Pour effacer l'ancien contenu de la vue Web

Quand vous appelez - loadHTMLString:baseURL: il ne se bloque pas tant que le chargement n'est pas terminé. Une fois qu'il enregistre votre demande, il revient et se charge en arrière-plan.

Par conséquent, vous devrez attendre la fin du premier chargement avant de lancer une nouvelle demande de chargement.

Avec UIWebView vous utiliseriez UIWebViewDelegate's - webViewDidFinishLoad:.

Avec WKWebView, vous utiliseriez WKNavigationDelegate's - webView:didFinishNavigation:

Une autre approche si vous vouliez vraiment effacer le contenu sans méthode déléguée serait d'utiliser JavaScript (par exemple https://stackoverflow.com/a/4241420/3352624 ). Ensuite, pour UIWebView, vous pouvez invoquer - stringByEvaluatingJavaScriptFromString:. Cette méthode bloquera l'exécution jusqu'à ce que JavaScript s'exécute et revienne.

Pour WKWebView, vous devez faire quelque chose comme https://stackoverflow.com/a/30894786/3352624 puisque son - evaluateJavaScript:completionHandler: ne bloque pas.

Faire "disparaître" les anciens contenus

Si vous voulez vraiment faire "disparaître l'ancienne page Web", vous pouvez temporairement couvrir la zone de contenu de la vue Web avec une UIView vierge. Vous pouvez masquer le contenu lorsque vous lancez le chargement, puis afficher le contenu à l'aide des méthodes déléguées ci-dessus une fois le chargement terminé.

3
davew

Le code suivant efface l'écran, puis navigue

rapide

webView.evaluateJavaScript("document.documentElement.remove()") { (_, _) in
    self.webView.load(urlRequest)
}
1
sibur

Utilisez plutôt JavaScript.

webView.evaluateJavaScript("document.body.remove()")
1
yesleon

rapide

webView.load(URLRequest(url: URL(string: "about:blank")!))

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: {
   //Load request or write code here
})
0
ZAFAR007