我的UIWebview
使用loadHtmlString加载本地html文件。加载的页面包含指向其他本地html文件的链接以及使用互联网的真实链接。
我添加了一个后退按钮:
if([self.webView canGoBack]) [self.webView goBack];
这样可以正常工作,除了它无法识别用loadHtmlString加载的原始页面。
例如,如果我导航:
本地 - >本地 - >网络
本地X本地< - web(第一次回来工作,下一次没做任何事。)
如何让webview识别原始页面,以便后退按钮也适用于它?我能以某种方式将它添加到webview的历史记录中吗?
提前致谢!
答案 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))
}
}