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 に読み込みを完了する機会を与えていません。メインスレッドをブロックしないでください。

2 番目: webViewDidFinishLoad と webView:didFailLoadWithError の 2 つの UIWebView デリゲート メソッドがあります: - 必ず両方をリッスンしてください。

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

使ってみて[NSURL fileURLWithPath:filePath]

于 2012-05-02T16:01:37.923 に答える
0

次のコードを使用します

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

UIに影響を与えないように

于 2012-05-02T15:21:39.663 に答える