9

UIWebview使用 loadHtmlString 加载本地 html 文件。加载的页面具有指向其他本地 html 文件的链接以及使用 Internet 的真实链接。

我添加了一个后退按钮:

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

这可以正常工作,只是它无法识别使用 loadHtmlString 加载的原始页面。

例如,如果我导航:
local -> local -> web
local X local <- web (第一个返回有效,下一个什么也不做。)

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

提前致谢!

4

4 回答 4

11

我有同样的问题。我尝试管理历史记录,但很容易出错。现在我发现了一个更好的解决方案。

您要做的只是在调用 loadHTMLString/loadData 之前将 loadRequest 添加到 about:blank 并将其作为占位符。然后你就完全不用监控历史了。webview.canGoBack 和 canGoForward 将正常工作。当然,您将需要一个 hack 来处理返回占位符 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。只需让 Stack 记录所有字符串响应并在每个 loadHTMLString 上插入 about:blank 即可。并在每次返回 about:blank 时弹出堆栈。

于 2015-01-29T22:51:32.120 回答
5

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

    webView.load(URLRequest(url: URL(string: "about:blank")!))
    webView.loadHTMLString("<html><body><b>Your page data</b></body></html>", baseURL: nil)

只是它,没有别的!斯威夫特3

于 2017-06-24T01:40:43.670 回答
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 回答
0

您还可以仅加载带有要显示的 HTML 内容的数据 URL ,避免先进行空加载,然后单独加载内容。

格式为: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))
    }
}
于 2021-04-19T10:53:41.160 回答