web-dev-qa-db-ja.com

UIWebView / WKWebViewのコンテンツをクリアするにはどうすればよいですか?

さまざまなURLを循環できるWebビューがあります。あるものから別のものに切り替えるとき、次のページをロードする前に古いWebページを非表示にします。 Webビューを再割り当てせずにこれを行うにはどうすればよいですか?

[self.webView loadHTMLString:@"" baseURL:nil];と同じ関数に自分のURLをロードすると、前のWebページがまだ残ります。

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

編集:これは明らかにあなたにとって十分に明確ではありません。以下のコードはWebビューをクリアしません。新しいページが読み込まれるまで前のページを表示します。

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

コントローラが終了する間、以下のコードを書くことができます。

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

空白のページを読み込むようにすることができます

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

WebViewの古いコンテンツをクリアするには

- loadHTMLString:baseURL:を呼び出すと、読み込みが完了するまでブロックされません。リクエストを記録すると、バックグラウンドで戻り、ロードされます。

その結果、新しいロード要求を開始する前に、最初のロードが完了するのを待つ必要があります。

UIWebViewでは、UIWebViewDelegate- webViewDidFinishLoad:を使用します。

WKWebViewでは、WKNavigationDelegate- webView:didFinishNavigation:を使用します

デリゲートメソッドなしでコンテンツを本当にクリアしたい場合の別のアプローチは、JavaScriptを使用することです(例 https://stackoverflow.com/a/4241420/3352624 )。次に、UIWebViewの場合、- stringByEvaluatingJavaScriptFromString:を呼び出すことができます。このメソッドは、JavaScriptが実行されて戻るまで実行をブロックします。

WKWebViewの場合、- evaluateJavaScript:completionHandler:はブロックしないため、 https://stackoverflow.com/a/30894786/3352624 のようにする必要があります。

古いコンテンツを「消滅」させるには

「古いWebページを非表示にする」だけにしたい場合は、一時的に空のUIViewでWebビューのコンテンツ領域を覆うことができます。ロードを開始するときにコンテンツを非表示にし、ロードが完了した後、上記のデリゲートメソッドを使用してコンテンツを表示できます。

3
davew

次のコードは、画面をクリアしてから移動します

スウィフト

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

代わりにJavaScriptを使用してください。

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

スウィフト

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

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