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

我试图用xcode创build一个快速的webapp,这是我现在的代码:

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,标题页等)。

(对不起我的英语不好)。

通过UIWebView委托调用。

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

对于WKWebview也有wknavigationdelegate didfinish ,但没有做的伎俩,因为SO问题WKWebView没有完成加载,当didFinishNavigation被调用 – 在WKWebView中的错误? 这个答案显示。

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

我认为使用本机swift或objective-c来检测页面加载时是一个不好的select。 更灵活有效的方法是在页面加载完成时使用javascript调用本地swift代码。 更重要的是,这也适用于特定的dom整理加载事件和非常dynamic的内容。

如何从javascript调用swift请参考这篇文章 。

以下是使用anjularjs的dynamic内容示例代码。

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-equivalent-event-listener-on-elements for more。