UIWebView开始两次 - IOS

时间:2016-03-23 09:24:33

标签: ios objective-c uiwebview uiprogressview uiwebviewdelegate

我在ProgressView正在加载时使用以下内容添加UIWebView,并在完成后将其解除。 问题是UIWebView启动了两次,还有ProgressView,所以当页面完成加载时,只有一个ProgressView被解雇,而另一个则没有。

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

可以多次调用此委托方法(例如,在重定向的情况下)。所以我建议将Progress视图初始化代码移动到 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];
}

答案 2 :(得分: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请求等)< / p>

我个人使用下面的代码来管理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]);
}