Méthode didFailLoadWithError obligatoirement valide avec un UIViewController ?
apocaalypso
Membre
Bonjour,
dans mon application iPhone, l'utilisateur a la possibilité de regarder les news de l'application directement via celle-ci grâce à une UIWebView.
Le problème c'est que je n'ai pas de méthode appellée lorsque la page internet ne peut pas se charger (didFailLoadWithError:).
J'ai donc ceci pour charger la page Internet :
J'ai donc rajouté à la suite :
Mais rien ne s'affiche lorsque Internet est coupé.
Je pense que c'est parce que le type de mon .m est UIView et non UIViewController non ?
Si c'est ça je n'ai plus qu'à tout recommencer...
Merci de vos conseils !
dans mon application iPhone, l'utilisateur a la possibilité de regarder les news de l'application directement via celle-ci grâce à une UIWebView.
Le problème c'est que je n'ai pas de méthode appellée lorsque la page internet ne peut pas se charger (didFailLoadWithError:).
J'ai donc ceci pour charger la page Internet :
<br />-(void)switchToNews:(NSString *)website<br />{<br /> // Removing the Home views<br /> [homeButtonsView removeFromSuperview];<br /> <br /> // Transition<br /> [UIView beginAnimations:nil context:NULL];<br /> [UIView setAnimationDuration:0.5];<br /> [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:[self superview] cache:NO];<br /> // Adding the News view<br /> [self addSubview:newsView];<br /> [UIView commitAnimations];<br /><br /> // Make the background transparent<br /> [newsView setBackgroundColor:[UIColor clearColor]];<br /> <br /> [self loadWebsite:website];<br />}<br /><br />-(void)loadWebsite:(NSString *)website<br />{<br /> // Loading the last news<br /> NSURL *newsURL = [NSURL URLWithString:website];<br /> NSURLRequest *newsReq = [NSURLRequest requestWithURL:newsURL];<br /> // Load the request in the WebView<br /> [newsWebView loadRequest:newsReq];<br />}<br />
J'ai donc rajouté à la suite :
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error<br />{<br /> // load error, hide the activity indicator in the status bar<br /> [UIApplication sharedApplication].isNetworkActivityIndicatorVisible = NO;<br /><br />UIAlertView * scoreError = [[UIAlertView alloc] initWithTitle: @"Network error" message: @"Error sending your info to the server" delegate: self cancelButtonTitle: @"Ok" otherButtonTitles: nil];<br /> <br />[scoreError show];<br />}<br />
Mais rien ne s'affiche lorsque Internet est coupé.
Je pense que c'est parce que le type de mon .m est UIView et non UIViewController non ?
Si c'est ça je n'ai plus qu'à tout recommencer...
Merci de vos conseils !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Elle est donc appellée sur le delegate de ta UIWebView... encore faut-il que tu définisses ce dernier !
Un "newsView.delegate = (l'objet qui va implémenter ta méthode didFailLoadWithError)" est donc la solution... en l'occurence "newsView.delegate = self" permettrait que lorsque ta newsView foire son chargement, elle appelle didFailLoadWithError sur... self, autrement dit ton UIViewController dans lequel tu mets ce code.
Je ne comprend pas.
Moi je pensais que c'était une UIWebView mais ça ne semble pas être le cas ?
Ou alors c'est une UIWebView de manière général, mais ta variable newsView est typée comme étant une UIView (ce qui est légal puisque UIWebView hérite de UIView...) mais du coup quand tu veux accéder aux propriétés spécifiques de la classe UIWebView, il faut bien sûr transtyper (caster) ta variable newsView en UIWebView.
De plus, je t'invite à lire la doc de UIWebView, la propriété delegate... et la doc du protocole UIWebViewDelegate (d'ailleurs il faudra que tu déclares ton "self" (ton UIViewController en l'occurence) comme implémentant le protocole UIWebViewDelegate dans ton .h sinon il va pas aimer). Entre autres il est dit dans la doc qu'avant de désallouer une UIWebView (ta newsView en l'occurence), il faut absolument remettre son delegate à nil (typiquement dans le dealloc de la UIWebView), donc faudra pas oublier.
C'est la UIWebView qui appelle sur son delegate la méthode webView:didFailLoadWithError:
Il suffit donc de définir le delegate de ta UIWebView à l'objet (typiquement ici self, ton UIViewController) dans lequel tu as implémenté cette méthode.
Utilisation classique d'un delegate, quoi
Merci beaucoup Ali pour ton aide !
J'ai une UIAlertView avec deux boutons : un pour quitter la vue "Quit" et l'autre pour cancel "No" :
Et je voudrais faire quelque chose si l'utilisateur tape le bouton "Quit".
J'ai donc :
Mais ça ne marche pas.
Pourtant j'ai bien delegate:self dans mon UIAlertView non ?
en faite dans ton code d'origine tu avais ca
l'erreur etait bien dans la premiere ligne
Par ailleur mon if n'était pas associé au bon bouton, j'ai remplacé par 0.
Et il n'y a aucune obligation à mettre le même nom pour le paramètre que pour ta variable qui t'a servi à créer ton AlertView... d'ailleurs si en plus de ça ton UIAlertView* quitMessage était une variable d'instance (et non une variable locale à ta méthode qui crée le UIAlertView) ça ferait de l'obfuscation (shadowing), puisque tu aurais 2 variables de même nom (celle de ta classe, la variable d'instance, et celle de ta signature de méthode, variable locale à la méthode)...
C'était donc bien juste le "if" qui était faut comme suggéré dès le premier message
bon ben je vais allez tester ce que tu viens d'expliquer comme ca je vais un peu comprendre aussi
Merci pour tes grandes explications Ali !
Du coup quand on clique sur "Quit" c'est cancel.