17

を使用して実装された基本的な Web ブラウザーがありUIWebViewます。UIWebViewDelegate一部のページでは、どのメソッドも呼び出されていないことに気付きました。

これが発生するページの例: http://www.youtube.com/user/google . 問題を再現する手順は次のとおりです (コントローラーのメソッドNSLogに呼び出しを挿入してください)。UIWebViewDelegate

  1. 上記の YouTube URL をUIWebView [ここではUIWebViewDelegate、ページの読み込み時にメソッドが呼び出されることに注意してください] に読み込みます。
  2. ページの「アップロード」カテゴリをタッチします
  3. そのカテゴリの任意のビデオをタップします [問題:新しいページが読み込まれるが、UIWebView デリゲートが呼び出されないことに注意してください]

他のリンクを読み込むときにデリゲート メソッドが呼び出されるため、これは のデリゲートが正しく設定されていないという問題ではないことはわかっていUIWebViewます (たとえば、YouTube の外に移動するリンクをクリックしようとすると、デリゲートに気付くでしょう)。メソッドが呼び出されます)。

私の最初の直感は、デリゲート メソッドを呼び出さない可能性がある AJAX を使用してページが読み込まれていることが原因である可能性があるということでした。しかし、iPhone の Safari を確認したところ、この問題は見られなかったので、私の側に問題があるに違いありません。

また、Three20'sTTWebControllerにも私が抱えているのとまったく同じ問題があることに気付きました。

しかし、この問題から発生する問題は、デリゲート メソッドが呼び出されないと、UI を更新して、新しい要求が読み込まれたときに、前後のブラウジング ボタンを有効/無効にすることができないことです。

なぜこれが起こっているのか、または新しいリクエストが行われたときにUIを更新するためにどのように回避できますか?

4

3 に答える 3

20

これはiOSのバグではありません。ページは実際にはリロードされていません。UIWebViewデリゲートは、新しいページリクエストに続いてトリガーされますが、そのページはそれを行いません。

説明しながら、そのページのビデオリンクをクリックすると、デスクトップSafariで何が起こるかを注意深く見てください。アドレスバーに注意してください。アドレスは変更されますが、重要なことにページはリロードされません

これはすべて、ページをリロードすることではなく、JavaScriptによって処理されます。簡単に言うと、ページがリロードされることはないため、UIWebViewデリゲートが呼び出される理由はありません

私を信じていない場合は、これを最終的に証明するために、JavaScriptを無効にして説明した手順を繰り返してみてください。ページの動作がまったく異なることに気付くでしょう。

于 2011-01-09T22:50:27.487 に答える
1

これは良い解決策ではありませんが、ボタンのステータスを更新するためにNSTimerを使用しています。

- (BOOL)webView:(UIWebView *)_webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    if (!_timer && [request.URL.absoluteString rangeOfString:@"youtube.com"].length != 0) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:0.5
                                                  target:self
                                                selector:@selector(checkNavigationStatus)
                                                userInfo:nil
                                                 repeats:YES];
    }

    return YES;
}

//....
//....
//....

- (void)checkNavigationStatus
{
    // Check if we can go forward or back
    backButton.enabled = self.webView.canGoBack;
    forwardButton.enabled = self.webView.canGoForward;
}
于 2011-01-31T09:42:20.783 に答える
-3

これは iOS 4.2 で修正されたようです。iOS 4.2 で動作します。

于 2011-02-21T05:10:14.017 に答える