【问题标题】:UIWebView FinishLoad/Detection issueUIWebView FinishLoad/检测问题
【发布时间】:2017-05-25 02:16:48
【问题描述】:

当使用UIWebView 时,我想检测网页在iOS 应用程序中完成加载的时刻。 为此,我尝试使用this post 中提到的解决方案。

但问题是 webViewDidFinishLoad() 函数在页面出现在显示器上之前被调用(几乎在调用 loadRequest() 之后)解无用。 我错过了什么吗?还是有更好(或不同)的方法?

附:我正在使用 Xcode 版本 8.3.2 和 iOS 版本 10.3.2

【问题讨论】:

  • 看起来你的 html 页面有一个异步加载内容的方式,这就是为什么 webViewDidFinishLoad() 函数被调用得非常快的原因。
  • 我只是在 iOS 应用程序的 UIWebView 中加载任意网页,并不知道任何所谓的 moment.html 页面。请原谅我缺乏知识。在哪里可以查看这个 moment.html?
  • 在网络浏览器(如 Chrome、Safari)中打开网址。然后右键页面,选择“查看页面源代码”,就可以查看html源代码了。
  • 这不能回答我的问题。我希望我的 iOS 应用程序可以在用户要打开的任何页面上运行,该应用程序不能取决于所选页面的编写方式。我关心的是编写 iOS 应用程序而不是编写一些网页。
  • 由于无法控制网页的内容,因此无法非常精确地控制调用webViewDidFinishLoad()的时机。也许网页中有一个 JS 任务需要 1 分钟才能完成,但网页在 1 秒内完成加载。

标签: ios swift uiwebview uiwebviewdelegate


【解决方案1】:

每页加载的HTML内容都会调用webViewDidFinishLoad... 所以我放了三种类型的验证。使用最适合您的那个。

var webViewPages = 0

func webViewDidStartLoad(_ webView: UIWebView) {
    webViewPages += 1
}

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
    webViewPages -= 1
}

func webViewDidFinishLoad(_ webView: UIWebView) {

    if (webView.isLoading){
        return
    }

    if webView.stringByEvaluatingJavaScript(from: "document.readyState") != "complete"{
        return
    }

    webViewPages -= 1

    if webViewPages > 0{
        return
    }
    // Calculating webview height
    let height = Int(webView.stringByEvaluatingJavaScript(from: "document.body.scrollHeight")!)

}

【讨论】:

  • 在我的情况下 webViewDidFinishLoad() 只被调用一次(太快了),所以我没有任何选择来检查内部的东西,就像你在代码中所做的那样。
  • 除此之外我还能分享哪些相关的内容:func webViewDidFinishLoad(_ webView: UIWebView) { print(#function + "嗨,我们完成了!") }
  • 这实际上不会告诉您页面何时呈现,我记得,没有可靠的方法可以知道这一点。
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 2011-02-10
  • 2011-08-13
  • 2016-01-18
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多