0

我在 UIVIewController 中使用 webview 并使用以下方法在其中加载本地 HTML 文件。

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:filePath]]];

如果我将此方法放在 ViewDidLoad 中,我会在导航到看起来不太好的控制器时看到白色闪烁。

我尝试将此方法放在 ViewWillAppear 中,如下所示。我正在使用 webViewLoaded 标志来确保 webview 已加载,然后只显示当前视图,否则它正在等待,但它正在无限循环等待!

- (void)viewWillAppear:(BOOL)animated {
    webViewLoaded = NO;

    webView.scalesPageToFit = allowZoom;
    webView.dataDetectorTypes = UIDataDetectorTypeNone;
    webView.delegate = self;

   [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:filePath]]];

   int count = 0;

   while(webViewLoaded == NO) 
   {
        NSLog(@"Waiting...");
        [NSThread sleepForTimeInterval:0.1];
        if(count++ > 10) break;
   }
}

- (void)webViewDidFinishLoad:(UIWebView *)localwebView {
    webViewLoaded = YES;
}

我也在 ViewDidLoad 中尝试过同样的事情,但它仍然处于无限循环中。

请注意,webViewLoaded 是“volatile BOOL”,但未调用 webview 委托方法。不知道发生了什么!

谁能帮我解决这个问题。谢谢。

4

3 回答 3

3

首先:您阻塞了主线程并且没有给 WebView 任何完成加载的机会。永远不要阻塞你的主线程。

第二:有两个 UIWebView 委托方法:webViewDidFinishLoad 和 webView:didFailLoadWithError: - 确保两者都听。

如果您试图等到 WebView 完成加载并且之后才显示您的控制器 - 使用委托或块。请注意,这不是一种正确的做事方式 - 我只是在修改您的示例以使其工作:

子控制器(带有 WebView):

-(void)startLoadingWithParent:(id)_parent {
  self.parent = _parent;
  NSURL * url = [[NSBundle mainBundle] URLForResource:@"resource" withExtension:@"html"];
  [webView loadRequest:[NSURLRequest requestWithURL:url]];
}

-(void)webViewDidFinishLoad:(UIWebView *)webView {
  [parent showMe:self];
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
  [parent showError:error];
}

主控制器:

-(void)doSomething {
   SecondController * ctrl; /// secondController should be created AND has its view loaded at this point
   /// ctrl = [SecondController new];
   /// ctrl.view;
   [ctrl startLoadingWithParent:self];
   /// show user that we're doing something - display activity indicator or something
 }

 -(void)showMe:(UIViewController*)me {
    [self.navigationController pushViewControllerAnimated:me];
 }
于 2012-05-02T19:42:32.050 回答
0

使用以下代码

[self performSelectorInBackground:@selector(webViewLoaded) withObject:nil];

这样它就不会影响您的用户界面

于 2012-05-02T15:21:39.663 回答
0

尝试使用[NSURL fileURLWithPath:filePath]

于 2012-05-02T16:01:37.923 回答