2016-03-23 20 views
1

私がProgressViewを追加する際には、UIWebViewをロードして終了している間、私はこれを使用しています。 問題は、UIWebViewが2回起動され、ProgressViewも開始されるため、ページのロードが完了すると1つのProgressViewのみが終了し、もう1回は終了しません。UIWebViewが2回起動しました -

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 

答えて

1

いけない知っているが、あなたはこれを行うことができます。

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

ありがとう/停止動作を開始する活動の指標を管理する@KDeogharkar –

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

このデリゲート方法は、(例えば、リダイレクトの場合に)複数回呼び出すことができます。だから私はあなたのプログレスビューの初期コードをviewDidLoadメソッドに移動することをお勧めします。

- (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 

iframeローディングなど、例えばリダイレクト、複数回トリガされてもよいです。ここでオブジェクトを初期化するのは非常に不便です。

そのため

使用Lazy Initializationデザインパターンが

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

はところで、あなたはエラー処理を忘れ:

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

第二のものがある - (多分あなたはそれが大したことではないのケースのため)が、通常、それはですUIWebViewのロードが停止したとき(ロードされたすべてのリソース、AJAXリクエストなど)を正確に判断するのは難しいです

個人的に私はコードのようなものを使用しています以下のあなたの答えのための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]); 
} 
関連する問題