在我的应用程序中,我试图在我的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];
}
答案 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