我在一个选项卡中有一个UIWebView加载到viewDidLoad中,但是如果用户点击其他选项卡,加载将被中断并且
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
将被调用,但我想知道如果用户再次点击上一个标签,如何加载webView,如果没有加载它将重新加载它,如下所示
-(void)viewWillAppear:(BOOL)animated
{
if (!webView)
{
NSURL *url = [NSURL URLWithString:@"url"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
}
}
但它不起作用,请帮忙吗?
答案 0 :(得分:28)
UIWebview有一个webViewDidFinishLoad委托方法。设置一个bool来表明这已经完成。
- (void)webViewDidStartLoad:(UIWebView *)webView {
webViewDidFinishLoadBool = NO;
loadFailedBool = NO;
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
loadFailedBool = YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
if (!loadFailedBool)
webViewDidFinishLoadBool = YES;
}
答案 1 :(得分:8)
如果你还没有工作,这是一个有效的例子。它还会在无法加载时显示警报,并且警报仅显示一次。
部首:
@interface MyViewController : UIViewController <UIWebViewDelegate> {
BOOL wasLoaded;
BOOL alertWasShown;
}
@property (nonatomic, retain) IBOutlet UIWebView *myWebView;
@end
实现:
- (void)loadWebView:(NSString *)urlString {
if (wasLoaded == NO) {
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *requestObject = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:requestObject];
}
}
- (void)viewWillAppear:(BOOL)animated {
NSString *urlString = @"put your url here";
[self loadWebView:urlString];
}
- (void)viewDidLoad {
[super viewDidLoad];
wasLoaded = NO;
alertWasShown = NO;
myWebView.delegate = self;
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
// Not necessary to do anything here.
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
wasLoaded = YES; // Indicates that it finished loading.
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
if (alertWasShown == NO) {
UIAlertView *alert = ... // Create an alert.
[alert show];
alertWasShown = YES;
}
}
我希望有所帮助。
答案 2 :(得分:1)
原始问题确实是多年前发布的。 最近我不得不为这个问题找到一个可靠的解决方案。
以下是适合我的解决方案:
完整的代码是:
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
[webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
if (result != nil) {
// Call your method here
}
if(error) {
NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
}
}];
}
答案 3 :(得分:0)
对于具有多个框架的页面,还应使用UIWebView.loading属性。
Apple的doc:@property(非原子,readonly,getter = isLoading)BOOL加载 一个布尔值,指示接收器是否已完成加载内容。
如果是,接收方仍在加载内容;否则,没有。
在iOS6(测试版4)中,Apple似乎也修复了此属性的一些问题。 http://code-gotcha.blogspot.fi/2012/08/uiwebviewloading-in-ios-6-fixed.html