2010-09-23 8 views
0

Tous,XCode connexion WebView/erreur de serveur de traitement

Je suis assez nouveau pour XCode et essaie d'obtenir une poignée sur la façon de mieux faire face à des problèmes de connexion lorsque vous essayez d'utiliser un WebView. Je sais qu'il y a des questions connexes sur le SO, mais aucune ne semble offrir des solutions complètes. J'ai le code suivant, mais cela semble un peu inefficace. Heureusement, quelqu'un peut m'aider à le refactoriser jusqu'à un point où il peut être utilisé partout où un UIWebView est appelé.

REMARQUE: Veuillez ignorer les problèmes de mémoire pour le moment. Je réalise que cela doit également être ajouté.

- (void)viewDidLoad { 
    [webView setDelegate:self]; 

    NSString *urlAddress = @"http://www.somesite.com/somepage"; 
    NSURL *url = [NSURL URLWithString:urlAddress]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

    NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 

    [super viewDidLoad]; 
} 

// Check for URLConnection failure 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    UIAlertView *connectionError = [[UIAlertView alloc] initWithTitle:@"Connection error" message:@"Error connecting to page. Please check your 3G and/or Wifi settings." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [connectionError show]; 
    webView.hidden = true; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 

    //Check for server error 
    if ([httpResponse statusCode] >= 400) { 
     UIAlertView *serverError = [[UIAlertView alloc] initWithTitle:@"Server error" message:@"Error connecting to page. If error persists, please contact support." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [serverError show]; 
     webView.hidden = true; 

    //Otherwise load webView 
    } else { 
     // Redundant code 
     NSString *urlAddress = @"http://somesite.com/somepage"; 
     NSURL *url = [NSURL URLWithString:urlAddress]; 
     NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

     [webView loadRequest:urlRequest]; 
     webView.hidden = false; 
    } 
} 

// Seems redundant since we are already checking the URLConnection 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 

    UIAlertView *connectionError = [[UIAlertView alloc] initWithTitle:@"Connection error" message:@"Error connecting to page. Please check your 3G and/or Wifi settings." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    [connectionError show]; 
} 

Je suppose que ce que je me demande est, y at-il des raccourcis pour atteindre la fonctionnalité souhaitée? Puis-je accéder d'une manière ou d'une autre à URLResponse via le WebView directement? Une valeur nulle pour URLConnection ou UIWebView implique-t-elle des erreurs de connexion sans avoir à les vérifier explicitement? Existe-t-il un moyen plus simple de transférer l'URLRequest dans les méthodes déléguées afin qu'elle ne soit pas recréée deux fois?

Merci d'avance!

Répondre

5
- (void)viewDidLoad { 
    webView = [[UIWebView alloc]init]; 
    [webView setDelegate:self]; 
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://yourUrl.com"]]] 
    [super viewDidLoad]; 
} 

#pragma mark UIWebView delegate methods 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ 
    //read your request here 
    //before the webview will load your request 
    return YES; 
} 
- (void)webViewDidStartLoad:(UIWebView *)webView{ 
    //access your request 
    webView.request; 
} 
- (void)webViewDidFinishLoad:(UIWebView *)webView{ 
    //access your request 
    webView.request;  
} 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 
    NSLog(@"could not load the website caused by error: %@", error); 
} 
-(void)dealloc{ 
[webView release]; 
[super dealloc]; 
} 

Vous pouvez charger la page Web avec NSURLRequest directement dans votre WebView. Avec les méthodes de rappel de délégué, vous pouvez modifier le comportement de votre webview.

Avec ce morceau de code, vous devriez le faire.

+0

J'aime ça. Ma seule question serait de savoir s'il existe un moyen d'accéder au statuscode httpresponse à partir de l'une de ces méthodes de rappel déléguées. – Dave