我试图在xcode中使用swift创建一个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所有定义的文档?我的意思是..(开始/结束加载,当前网址,标题页等)?
(抱歉我的英文)。
答案 0 :(得分:30)
通过UIWebView
委托电话。
您需要将webView delegate
设置为当前控制器,并符合UIWebViewDelegate
协议。当webView完成加载后,页面func webViewDidFinishLoad(_ webView: UIWebView)
将被调用。
答案 1 :(得分:2)
对于WKWebview,还有wknavigationdelegate didfinish,但不会像SO问题 WKWebView didn't finish loading, when didFinishNavigation is called - Bug in WKWebView? 和 answer 那样显示技巧
我还发现当加载的页面非常复杂且非常复杂时,UIWebview的webViewDidFinishLoad(- webView: UIWebView)
也无效。
我认为使用native 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 ,您还可以重新 how-to-call-a-function-after-a-div-is-ready 或 check-if-a-given-dom-element-is-ready 或 jquery-ready-equivalent-event-listener-on-elements 了解更多信息。