2016-03-23 15 views
1

Ich benutze die unten, um eine ProgressView hinzuzufügen, während die UIWebView wird geladen und entlassen, wenn es fertig ist. Das Problem ist die UIWebView wird zweimal gestartet und auch die ProgressView, So wenn die Seite fertig Laden nur eine ProgressView wird entlassen und die andere nicht.UIWebView gestartet zweimal - IOS

ViewController.h

#import <UIKit/UIKit.h> 

@interface DirectionViewController : UIViewController <UIWebViewDelegate> 
    @property (weak, nonatomic) IBOutlet UIWebView *directionWebView; 
@end 

ViewController.m

@interface ViewController() 
    @property UIColor *yellowColor; 
    @property MRProgressOverlayView *progressView; 
@end 

@implementation ViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.yellowColor = 
    [UIColor colorWithRed:244.0f/255.0f 
        green:208.0f/255.0f 
        blue:63.0f/255.0f 
        alpha:1.0f]; 
    self.directionWebView.delegate = self; 
    NSString *urlMap = [NSString stringWithFormat:@"%@%f,%f&zoom=14", @"http://maps.google.com/maps?q=", self.coordLat, self.coordLong]; 
    NSURL *url = [NSURL URLWithString:urlMap]; 
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 
    [self.directionWebView loadRequest:urlRequest]; 
} 

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSLog(@"WebView start loading..."); 
    self.progressView = [MRProgressOverlayView new]; 
    self.progressView.mode = MRProgressOverlayViewModeIndeterminateSmall; 
    [self.view.window addSubview:self.progressView]; 
    [self.progressView setTintColor:self.yellowColor]; 
    [self.progressView setTitleLabelText:@"Loading ..."]; 
    [self.progressView show:YES]; 
    return YES; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [self.progressView dismiss:YES]; 
} 
@end 

Antwort

1

weiß nicht, warum es zweimal ruft aber Sie können dies tun.

if(!self.progressView){ 
self.progressView = [MRProgressOverlayView new]; 
    self.progressView.mode = MRProgressOverlayViewModeIndeterminateSmall; 
    [self.view.window addSubview:self.progressView]; 
    [self.progressView setTintColor:self.yellowColor]; 
    [self.progressView setTitleLabelText:@"Loading ..."]; 
    [self.progressView show:YES]; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [self.progressView dismiss:YES]; 
self.progressView = nil; 
} 
+0

Vielen Dank für Ihre Antwort @KDeogharkar –

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

Diese Delegatmethode kann mehrmals aufgerufen werden (im Falle der Umleitung zum Beispiel). Daher würde ich empfehlen, den Fortschrittsanzeige-Initialisierungscode auf viewDidLoad Methode zu verschieben.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //... 
    self.progressView = [MRProgressOverlayView new]; 
    self.progressView.mode = MRProgressOverlayViewModeIndeterminateSmall; 
    [self.view.window addSubview:self.progressView]; 
    [self.progressView setTintColor:self.yellowColor]; 
    [self.progressView setTitleLabelText:@"Loading ..."]; 
} 

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 
    NSLog(@"WebView start loading..."); 
    [self.progressView show:YES]; 
    return YES; 
} 

-(void)webViewDidFinishLoad:(UIWebView *)webView { 
    [self.progressView dismiss:YES]; 
} 
1
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

es kann mehr als einmal ausgelöst werden, beispiels umleitet, iframe Laden und so weiter. Es ist sehr unpraktisch, Objekte hier zu initialisieren.

Verwenden Lazy Initialization Entwurfsmuster für sie

- (MRProgressOverlayView *)progressView { 
    if (_progressView) { 
     _progressView = [... alloc] init]; 
     // ... setup your progressView 
    } 
    return _progressView; 
} 

btw, vergessen Sie Bedienungsfehler:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    // You need to stop loading indicator here, right?! 
} 

zweite Sache ist, - (vielleicht für Sie Fall ist es keine große Sache), aber in der Regel ist es Schwierig, genau zu bestimmen, wann UIWebView den Ladevorgang beendet hat (alle geladenen Ressourcen, AJAX-Anfragen usw.)

Persönlich verwende ich so etwas wie Code unten zu verwalten Aktivitätsanzeige Start/Stop-Verhalten für UIWebView

#pragma mark UIWebViewDelegate 

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 
navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSLog(@"Webview (%p) starting to load URL: %@", self, request.URL); 
    self.URL = request.URL; 
    return YES; 
} 

- (void)webViewDidStartLoad:(UIWebView *)webView 
{ 
    [self.spinner startAnimating]; 
    self.webViewLoadingCount++; 
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    self.webViewLoadingCount--; 
    if (self.webViewLoadingCount > 0) return; 
    [self.spinner stopAnimating]; 
} 

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    self.webViewLoadingCount--; 

    [self.spinner stopAnimating]; 

    // Ignore NSURLErrorDomain error (-999). 
    if (error.code == NSURLErrorCancelled) return; 

    // Ignore "Frame Load Interrupted" errors 
    if (error.code == 102 && [error.domain isEqual:@"WebKitErrorDomain"]) return; 

    NSLog(@"WebView (%p) experienced an error: %@.", self, [error localizedDescription]); 
}