1

Я использую ниже, чтобы добавить ProgressView, в то время как UIWebView загружает и отклоняет его, когда это будет сделано. Проблема заключается в том, что UIWebView запускается дважды, а также ProgressView. Поэтому, когда страница загружена, только один ProgressView уволен, а другой - нет.UIWebView запущен дважды - 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 

ответ

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 

Этот метод делегат может быть вызван несколько раз (в случае перенаправления, например). Поэтому я бы рекомендовал перенести код инициализации Progress view на 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; 
} 

BTW, вы забыли об обработке ошибок:

- (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]); 
}