9

loadHtmlStringUIWebviewを使用して、ローカルの html ファイルをロードします。読み込まれたページには、他のローカル html ファイルへのリンクと、インターネットを使用する実際のリンクがあります。

私は戻るボタンを追加しました:

if ([self.webView canGoBack]) [self.webView goBack];

これは、loadHtmlString でロードされた元のページを認識しないことを除けば、正常に機能します。

たとえば、
ローカル -> ローカル -> Web
ローカル X ローカル <- Web とナビゲートした場合 (最初の戻りは機能し、次は何もしません。)

戻るボタンも機能するように、webview に元のページを認識させるにはどうすればよいですか? どういうわけかwebviewの履歴に追加できますか?

前もって感謝します!

4

4 に答える 4

11

私は同じ問題を抱えていました。履歴を管理しようとしましたが、エラーが発生しやすくなります。今、私はこれのより良い解決策を発見しました。

やりたいことは、loadHTMLString/loadData を呼び出す前に、loadRequest を about:blank に追加し、それをプレースホルダーとして作成するだけです。その後、履歴の監視から完全に解放されます。webview.canGoBack と canGoForward は機能します。もちろん、プレースホルダー about:blank に戻るにはハックが必要です。これは webViewDidFinishLoad で行うことができます。コードのハイライトは次のとおりです。

関数内で loadHTMLString を呼び出す場合:

[weakSelf.fbWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
[weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url];

goBack を処理するコード:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  if ([webView.request.URL.absoluteString isEqualToString:@"about:blank"]
      && ![webView canGoBack] && [webView canGoForward]) {
    [weakSelf.fbWebView loadHTMLString:stringResponse baseURL:url];
  }
}

このソリューションを拡張して、最初の読み込みではない loadHTMLString を処理することも可能だと思います。スタックにすべての文字列応答を記録し、各 loadHTMLString に about:blank を挿入するだけです。about:blank に戻るたびにスタックをポップします。

于 2015-01-29T22:51:32.120 に答える
2

これが私が使用することになった回避策です:

WebViewのデリゲートを作成しました。これは、ユーザーが最初のページ(を使用してロードされたloadHtmlString)にいるかどうかを追跡していました。

戻るボタンが押され、WebViewが戻ることができなくなり、ユーザーが最初のページを表示していない場合、最初のページが再度ロードされます(を使用してloadHtmlString)。関連するコードは次のとおりです。

if ([self.webView canGoBack])
    [self.webView goBack];
else
{
    WebViewDelegate * customDel = (WebViewDelegate *) self.webView.delegate;
    if (customDel.onFirstPage == NO)
    {
        // Load original local page.
        [self.webView loadHTMLString:self.htmlStr baseURL:[[NSBundle mainBundle] bundleURL]];

        customDel.onFirstPage = YES;
    }
}

よりエレガントな解決策が出てきた場合に備えて、しばらくの間この答えを選択しません。

うまくいけば、これは誰かを助けます!

于 2012-12-14T19:39:57.503 に答える