iPhone UIWebView loadHtmlString未添加到历史记录中

时间:2012-12-06 22:57:43

标签: iphone ios uiwebview back

我的UIWebview使用loadHtmlString加载本地html文件。加载的页面包含指向其他本地html文件的链接以及使用互联网的真实链接。

我添加了一个后退按钮:

  

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

这样可以正常工作,除了它无法识别用loadHtmlString加载的原始页面。

例如,如果我导航:
本地 - >本地 - >网络
本地X本地< - web(第一次回来工作,下一次没做任何事。)

如何让webview识别原始页面,以便后退按钮也适用于它?我能以某种方式将它添加到webview的历史记录中吗?

提前致谢!

4 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。我试过管理历史,但它容易出错。现在我发现了一个更好的解决方案。

您要做的只是将loadRequest添加到about:blank并在调用loadHTMLString / loadData之前将其作为占位符。然后你完全没有监视历史。 webview.canGoBack和canGoForward将会正常工作。当然,你需要一个黑客来处理回到占位符:空白。您可以在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时,弹出堆栈。

答案 1 :(得分: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;
    }
}

如果弹出更优雅的解决方案,我暂时不会选择这个答案。

希望这有助于某人!

答案 2 :(得分:2)

正如Cloud Xu所说,你只需要预加载虚拟html,如下所示:

    webView.load(URLRequest(url: URL(string: "about:blank")!))
    webView.loadHTMLString("<html><body><b>Your page data</b></body></html>", baseURL: nil)
只是它,没有别的! Swift3

答案 3 :(得分:0)

你也可以只加载一个 Data URL 和你想显示的 HTML 内容,避免空加载然后单独加载内容。

格式为:data:text/html,[HTML string]

附言。 HTML 字符串必须是百分比编码(URL 编码)。

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    let htmlString = """
<html>
    <body>
        hello world
    </body>
</html>
"""
    if let url = URL(string: "data:text/html," + (htmlString.addingPercentEncoding(withAllowedCharacters: []) ?? "")) {
        webView.load(.init(url: url))
    }
}