Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UIWebView启动两次-IOS_Ios_Objective C_Uiwebview_Uiprogressview_Uiwebviewdelegate - Fatal编程技术网

UIWebView启动两次-IOS

UIWebView启动两次-IOS,ios,objective-c,uiwebview,uiprogressview,uiwebviewdelegate,Ios,Objective C,Uiwebview,Uiprogressview,Uiwebviewdelegate,我正在使用下面的添加一个ProgressView,而UIWebView正在加载和卸载它。 问题是UIWebView启动了两次,ProgressView也启动了两次,因此当页面加载完成时,只有一个ProgressView被取消,而另一个没有 ViewController.h #import <UIKit/UIKit.h> @interface DirectionViewController : UIViewController <UIWebViewDelegate>

我正在使用下面的添加一个
ProgressView
,而
UIWebView
正在加载和卸载它。 问题是UIWebView启动了两次,ProgressView也启动了两次,因此当页面加载完成时,只有一个ProgressView被取消,而另一个没有

ViewController.h

#import <UIKit/UIKit.h>

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

不知道为什么它会打两次电话,但你可以这样做

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;
}
可以多次调用此委托方法(例如在重定向的情况下)。因此,我建议将进度视图初始化代码移动到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];
}
它可能会被触发多次,例如重定向、
iframe
加载等。在这里初始化对象非常不方便

对其使用
惰性初始化
设计模式

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

谢谢你的回答@KDeogharkar
- (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?!
}
#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]);
}