webViewDidFinishLoad不工作?

时间:2014-10-01 18:52:23

标签: ios uiwebview

在我的应用程序中,我试图在我的UIWebView加载时显示启动图像,因此它不仅仅是一个空白屏幕。但是我的webViewDidFinishLoad方法不起作用。这意味着一旦UIWebView加载,就会出现启动图像,但不会从屏幕上消失。

我的方法代码是:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
     NSLog(@"content loading finished");
    [loadingImageView removeFromSuperview];  
}

对于该方法不起作用的任何帮助都将受到极大的赞赏。

我的.h:

@interface ViewController : UIViewController

-(IBAction)makePhoneCall:(id)sender;

@property (nonatomic, strong) IBOutlet UIWebView *webView;
@property(nonatomic, strong) UIImageView *loadingImageView;

@end

我的ViewDidLoad和webViewDidFinishLoading:

- (void)viewDidLoad {
    UIWebView *mWebView = [[UIWebView alloc] init];
    mWebView.delegate = self;
    mWebView.scalesPageToFit = YES;

    [super viewDidLoad];
}


//**************** Set website URL for UIWebView
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sleafordpizza.com/food"]]];


//**************** Add Static loading image to prevent white "flash" ****************/
UIImage *loadingImage = [UIImage imageNamed:@"LittleItalyLogo.png"];
loadingImageView = [[UIImageView alloc] initWithImage:loadingImage];
loadingImageView.animationImages = [NSArray arrayWithObjects:
                                    [UIImage imageNamed:@"LittleItalyLogo.png"],
                                    nil];
[self.view addSubview:loadingImageView];

}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
     NSLog(@"content loading finished");
    // Remove loading image from view
    [loadingImageView removeFromSuperview];
}

3 个答案:

答案 0 :(得分:3)

嗨,可能你没有设置合适的代表。

这是一个很小的代码提示。

-(void)viewDidLoad {

    mWebView = [[UIWebView alloc] init];
    mWebView.delegate = self;
    mWebView.scalesPageToFit = YES;
}

-(void)webViewDidFinishLoad:(UIWebView *)webView {

  [loadingImageView removeFromSuperview];  
   NSLog(@"finish");   
}

在你的.h文件中添加。

@interface MyView: UIViewController <UIWebViewDelegate> {
           UIWebView *webView;
}

代码修复。

对于.h文件

@interface ViewController : UIViewController<UIWebViewDelegate>


-(IBAction)makePhoneCall:(id)sender;

@property (nonatomic, strong) IBOutlet UIWebView *webView;
@property(nonatomic, strong) UIImageView *loadingImageView;


@end

对于.m文件

- (void)viewDidLoad
{


[super viewDidLoad];

webView.delegate = self;

//**************** Set website URL for UIWebView
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sleafordpizza.com/food"]]];


//**************** Add Static loading image to prevent white "flash" ****************/
UIImage *loadingImage = [UIImage imageNamed:@"LittleItalyLogo.png"];
loadingImageView = [[UIImageView alloc] initWithImage:loadingImage];
loadingImageView.animationImages = [NSArray arrayWithObjects:
                                    [UIImage imageNamed:@"LittleItalyLogo.png"],
                                    nil];
[self.view addSubview:loadingImageView];

}

答案 1 :(得分:1)

在某些时候,这个委托方法实际上永远不会被触发。在我的一些项目中,我遇到了同样严重的问题。

有一次,我实际上不得不用计时器解决它,每隔一秒检查一次网页视图的状态,看看能不能继续。

在那种特殊情况下,我只需要一个元素出现。由于注入了外部脚本错误,视图仍未触发完成加载事件。

所以,我刚刚开始加载web视图时启动了一个触发器,然后不时调用一个方法来查看web视图是否包含有问题的元素。

- (void)methodCalledByTimer {
     if (<I still do not have what I need>) {
        //The web view has not yet finished loading; keep checking
     } else {
        //The web view has finished loading; stop the timer, hide spinners and proceed
     }
}

如果绝对必要,您还可以检查网页视图是否实际加载:

- (void)methodCalledByTimer {
     if (self.webView.isLoading) {
        //The web view has not yet finished loading; keep checking
     } else {
        //The web view has finished loading; stop the timer, hide spinners and proceed
     }
}

然后,我自然也会检查finishedLoading事件,这是肯定的。记得还要实现webView:didFailLoadWithError:方法。

在等待网页完成加载时,有一些事情要记住。

例如,你真的需要它来停止加载,还是你还能做什么?就我而言,我需要一个元素。能够正确执行脚本是另一件可能需要的事情。

第二,是否使用任何外部资源加载页面?我曾经有外部脚本错误导致webViewDidFinishLoad:方法根本没有被调用。如果我删除了外部脚本,它就可以了。

第三,如果页面使用外部资源,您不仅会暴露自己资源的负载能力,还会暴露外部资源的负载能力。跟踪脚本,广告等...如果一个资源提供商正在缓慢地(或根本不提供)内容,您可以将页面永远停留在加载状态。

所以,我去检查别的东西。 :)

答案 2 :(得分:0)

我发现你没有处理错误。如果出现错误,则不会发生所有后续委托调用。当webview也使用插件时,我很惊讶地发现这是真的。它调用这个错误方法告诉你webview移交给代表,在我的情况下是电影播放器​​。

实现这一点,看看是不是这样。

-(void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    if (error.code == 204) {
        //request was handled by a plugin instead of by the webview directly
        ...
    }
    else
    {
        NSLog(@"didFailLoadWithError. ERROR: %@", error);
    }
}

我能够在此方法中执行所有剩余的加载工作,而不是webviewdidfinishLoad