2011-02-24 2 views
1

Je montre un UIWebView dans une application qui lui envoie des appels de méthodes de délégué, après avoir reçu des taps sur des liens. Dans le délégué Méthode"[[UIApplication sharedApplication] openURL" après que le lien est tapé dans UIWebView - Multitâche

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 

je prends ces appels, le processus le lien-urls et exécuter

[[UIApplication sharedApplication] openURL:processedURL]; 

Cela fonctionne comme prévu, je me retrouve au bon endroit.

Problème Multitâche: si je reviens dans mon application, qui est encore en cours d'exécution en arrière-plan après la fermeture, il appellera à nouveau la « webView shouldStartLoadWithRequest » avec le même lien, donc je finis par envoyer l'utilisateur à la page deux fois. Y a-t-il un moyen préféré d'éviter cela?

Solution:

Vous les gars sont tout à fait raison, je l'ai fait assez allongée si-else pour analyser l'URL donnée, mais pas dans toutes les branches de la décision pourrait se retrouver dans il existait un « retour non » ... bah, erreur totalement stupide;)

+0

Dans mon application, je ne vois pas le même comportement que vous voyez, où 'webView: shouldStartLoadWithRequest:' est appelé à nouveau après la reprise. Est-ce que vous renvoyez 'NON 'de cette méthode? –

Répondre

1

Effacez UIWebView afin que, lorsqu'il se recharge, aucune requête ne soit en attente. Ceci est probablement mieux fait de cette façon:

[webView loadRequest:nil]; 

Mais si cela ne fonctionne pas, vous pouvez utiliser:

[webView loadHTMLString:@"" baseURL:nil]; 

Et bien sûr, vous devriez retournerez NO de cette méthode déléguée puisque vous n » Je ne veux pas que le webview essaie de charger ce contenu.

1

Non testé, mais je vous suggère de le faire:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    [[UIApplication sharedApplication] performSelector:@selector(openURL:) 
              withObject:processedURL 
              afterDelay:0]; 
    return NO; 
} 

de cette façon, le rappel peut de retour si besoin, et dans la runloop très prochaine itération il sera appelez le openURL:.

Questions connexes