【问题标题】:iPhone UIWebView loadHtmlString not added to historyiPhone UIWebView loadHtmlString 未添加到历史记录
【发布时间】:2012-11-25 02:29:48
【问题描述】:

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

我添加了一个后退按钮:

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

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

例如,如果我导航:
本地 -> 本地 -> 网络
local X local

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

提前致谢!

【问题讨论】:

  • 我认为loadHtmlString: 对于除了最简单的用例之外的所有情况都是不好的做法。您应该考虑改为运行本地 Web 服务器。我在CocoaHTTPServerMustache templates 上取得了成功。如果您能够使用 HTML/JavaScript 编写整个应用程序,请考虑使用 Trigger.io 或类似名称。
  • 我的用例非常简单。只需将静态页面作为书籍的一部分提供格式。
  • 静态页面?太好了,将它们保存到您的包中并使用我在此处描述的技术stackoverflow.com/a/17557309/354144
  • 干杯尼尔,很高兴知道!

标签: iphone ios uiwebview back


【解决方案1】:

您也可以只加载一个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))
    }
}

【讨论】:

    【解决方案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)
    

    仅此而已!斯威夫特3

    【讨论】:

    • loadRequest 而不是加载。很好的答案!
    • @Nosov Pavel 您的解决方案适用于 ios 13...但低于 ios 13 则无法使用
    【解决方案3】:

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

    您要做的只是在 about:blank 中添加一个 loadRequest,并在调用 loadHTMLString/loadData 之前将其作为占位符。然后你就完全不用监控历史了。 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 时弹出堆栈。

    【讨论】:

    • 不错的解决方案。谢谢。
    【解决方案4】:

    这是我最终使用的解决方法:

    我为 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;
        }
    }
    

    我暂时不会选择这个答案,以防出现更优雅的解决方案。

    希望这对某人有所帮助!

    【讨论】:

    • 如果用户打开您的 html 页面,点击指向另一个 URL 的链接,那么如何切换 onFirstPage
    • 我认为它有一个错误。假设您使用 loadHTMLString 登陆站点 A。然后去B,然后去C。然后回到B,再回到A。然后如果你前进,它会直接去C。B不见了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2011-09-07
    • 1970-01-01
    • 2014-07-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多