在 Xcode 中用 Swift 确定在 webView 中完成加载网站

Determinate finish loading website in webView with Swift in Xcode

我正在尝试在 xcode 中使用 swift 创建一个网络应用程序,这是我当前的代码:

IBOutlet var webView: UIWebView!

    var theBool: Bool = false
    var myTimer = NSTimer()
    @IBOutlet var progressBar: UIProgressView!

override func viewDidLoad() {
   super.viewDidLoad()
   let url = NSURL(string: "http://whosebug.com")
   let request = NSURLRequest(URL: url)
   webView.loadRequest(request)
}

我有一个问题,如何确定网页在 webView 中的加载完成?

您知道包含 WebView 所有定义的文档吗?我的意思是 ..(开始/结束加载、当前 url、扉页等 ..)?

(对不起我的英语)。

通过 UIWebView 委托调用。

您需要将您的 webViews delegate 设置为当前控制器,并符合 UIWebViewDelegate 协议。当 webView 完成加载页面时 func webViewDidFinishLoad(_ webView: UIWebView) 将被调用。

对于WKWebview还有wknavigationdelegate didfinish, but not do the trick as the SO question and this 显示。

我还发现当要加载的页面非常复杂和动态时,UIWebview 的 webViewDidFinishLoad(- webView: UIWebView) 也不起作用。

而且我认为使用本机 swift 或 objective-c 来检测页面何时加载是一个糟糕的选择。更灵活有效的方法是在页面加载完成时使用javascript调用原生swift代码。更重要的是,这也适用于特定的 dom 完成加载事件和非常动态的内容。

关于如何从 javascript 调用 swift 参考这个 post

这是使用 anjularjs 的动态内容示例代码。

js,

var homeApp = angular.module('home', ['ui.bootstrap', 'ngAnimate']);
homeApp
    .directive("printerinfo",
    function() {
        return {
            restrict: "E",
            link: function() {       //call navite swift when page finishing loading
                try {
                    window.webkit.messageHandlers.testHandler.postMessage("Hello from JavaScript");
                } catch(err) {
                    console.log('The native context does not exist yet');
                }
            },

            templateUrl: "/static/tpls/cloud/app/printerinfo.php",
        }
    })

swift3,

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    print(message.name)
    if(message.name == "testHandler") {
        //webpage content loaded
        print(Date())
        print("javascript test call swift")
    }

这里我use angularjs to check element ready, you can also refter how-to-call-a-function-after-a-div-is-ready or check-if-a-given-dom-element-is-ready or jquery-ready-equivalent-event-listener-on-elements了解更多。