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

13

我正在尝试使用Xcode中的Swift创建Web应用程序,这是我的当前代码:

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://stackoverflow.com")
   let request = NSURLRequest(URL: url)
   webView.loadRequest(request)
}

我有一个问题,如何确定webView加载页面已完成?

您是否知道包含所有WebView定义的文档?我的意思是..(开始/结束加载,当前URL,标题页面等)?

(对我的英语表示抱歉)。

2个回答

30

通过 UIWebView 的代理调用。

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


'UIWebViewDelegate'协议现已弃用。因此,请另找一种方式来实现KVO。 - Karsten

3
对于WKWebView,也有wknavigationdelegate didfinish,但并没有像SO问题WKWebView didn't finish loading, when didFinishNavigation is called - Bug in WKWebView?和这个答案所示的那样有效。
我还发现,当要加载的页面非常复杂和动态时,UIWebview的webViewDidFinishLoad(- webView: UIWebView)也不起作用。
我认为使用本地Swift或Objective-C来检测页面何时加载完成是一个糟糕的选择。更灵活、更有效的方法是在页面完成加载时使用JavaScript调用本地Swift代码。而且,这也适用于特定的DOM完成加载事件和非常动态的内容。
有关如何从JavaScript调用Swift,请参阅此文章
这是一个使用AngularJS实现动态内容的示例代码。
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")
    }

在这里,我使用AngularJS检查元素是否准备就绪,您还可以参考如何在div准备就绪后调用函数检查给定的DOM元素是否准备就绪jQuery ready等效事件监听器以获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接