2010-05-29 4 views
21

J'ai actuellement un UIWebView qui est affiché dans une vue modale. Il s'agit essentiellement d'une vue détaillée qui fournit une vue d'une page lorsque l'utilisateur clique sur un lien. Lorsque la vue est ignorée puis reprise (lorsque l'utilisateur clique sur un autre lien), le contenu précédemment chargé est toujours visible et le nouveau contenu se charge «au-dessus» du dernier contenu. Cela est logique car l'instance de UIWebView persiste entre les sessions et n'est libérée que lorsque la mémoire est nécessaire.Effacer le contenu d'UIWebView en cas de rejet de la vue modale (iPhone OS 3.0)

Cependant, je voudrais effacer complètement le UIWebView quand la vue modale est fermée de sorte que 1) le contenu soit effacé et 2) la mémoire soit libérée. Jusqu'à présent, mes recherches et tentatives n'ont pas trouvé de réponse. Ces liens n'ont pas fonctionné pour moi:

  1. is it possible to free memory of UIWebView?
  2. Reused UIWebView showing previous loaded content for a brief second on iPhone

J'ai essayé [[NSURLCache sharedURLCache] removeAllCachedResponses]; et la mise WebView à zéro et de libérer manuellement le webView sur-vue modal à pas rejeter profiter. Des pensées des masses ratatinées?

Répondre

34

Libérer la vue Web est probablement la meilleure approche. Si une vue se trouve dans une hiérarchie de vues (avec une vue d'ensemble), vous devez appeler removeFromSuperview pour que la vue d'ensemble libère la vue.

Vous pouvez également charger une chaîne html pour un document vide:

[webView loadHTMLString:@"<html><head></head><body></body></html>" baseURL:nil]; 
65

Parfois loadHTMLString est trop lent. Vous pouvez également utiliser:

[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML = \"\";"]; 

Je ne suis pas sûr si cela libérer beaucoup de mémoire si ...

+2

Parfait! Probablement la solution la plus simple pour l'effacement visuel du webview. Je ne comprends toujours pas pourquoi loadHTMLString est si lent. Peut-être que c'est parce que je charge une autre page directement après, et webview arrête de charger et d'afficher la page vide quand il commence à charger le nouveau. – Cray

+0

La meilleure solution ici. Je ne sais pas pourquoi ce n'est pas la meilleure réponse. Quoi qu'il en soit - Bonne réponse !! – filou

+1

La meilleure chose à propos de cette méthode est que la méthode déléguée webViewDidFinishLoad ne sera pas appelée! – user523234

14

Il semble, dans certaines circonstances, les méthodes proposées par drawnonward et ne peuvent pas travailler voler (peut-être quelque chose à voir avec CSS sur la page qui est en cours d'effacement), mais cela fait un travail:

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

Dans mon cas, je devais effacer la vue web à partir de son contenu instantanément et être en mesure de commencer à charger autre chose tout de suite. Ni le chargement d'une chaîne HTML de document vide ni l'effacement de la page avec JavaScript n'ont donné l'effet escompté. Au lieu de cela je:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]]; 
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://stackoverflow.com"]]]; 

Et ce défriché la vue de l'arrière-plan par défaut et le chargement de initié page suivante comme prévu.

J'espère que cela aidera aussi quelqu'un d'autre.

8

L'évaluation de javascript est généralement plus rapide que le chargement d'une nouvelle demande.

[webview stringByEvaluatingJavaScriptFromString:@"document.open();document.close();"]; 
+1

La meilleure réponse que j'ai vu. –

0

je préfère les éléments suivants:

[m_webView stringByEvaluatingJavaScriptFromString:@"location.replace('about:blank')"] 
+1

pourquoi le préférez-vous? – jujule

Questions connexes