我有一个包含WebView的非常简单的应用程序。此webview加载HTML5应用程序,在webview中构建内容需要一些时间。
我希望在内容完成加载之前显示进度条,并在内容准备好后显示webview。大约需要10秒钟。
...
答案 0 :(得分:2)
override func viewDidLoad() {
super.viewDidLoad()
webView.frameLoadDelegate = self
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil) // add observer for key path
}
/// Observer listening for progress changes
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if (keyPath == "estimatedProgress") { // listen to changes and updated view
if self.webView.estimatedProgress == 0 { return }
// All UI operations always in main thread
dispatch_async(dispatch_get_main_queue(), {
// *100 because progressIndicator in Mac OS wants values from 0 to 100
self.progressIndicator.doubleValue = self.webView.estimatedProgress * 100
})
}
}
/// Hide progress indicator on finish
func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!) {
dispatch_async(dispatch_get_main_queue(), { self.progressIndicator.hidden = true })
}
/// Show progress indicator on start page loading
func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!) {
dispatch_async(dispatch_get_main_queue(), { self.progressIndicator.hidden = false })
}
override func viewWillAppear() {
super.viewWillAppear()
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if (keyPath == "estimatedProgress") { // listen to changes and updated view
DispatchQueue.main.async {
// Here you can do set your actions on progress update
// E.g.: someProgressBar.doubleValue = self.webView.estimatedProgress * 100
}
}
}
override func viewWillDisappear() {
super.viewWillDisappear()
webView.removeObserver(self, forKeyPath: "estimatedProgress")
}
我已经使用带有嵌入式WKWebViewController和NSProgressIndicator的NSViewController创建了Swift 3 Cocoa code snippet,因此您可以查看实例。
答案 1 :(得分:0)
您需要创建一个符合WebFrameLoadDelegate协议的类,并将其设置为WebView的委托。
Cocoa中的委托是其回调模式。您创建了一个符合协议的类,实现了所需的消息以及您需要的任何可选消息,将该类添加为主类的委托,在您的情况下是WebView,并且您的委托在主类中发生事件时获取消息
从您的委托中,您可以创建一个重复1/10秒的计时器,并向主WebView发送消息- (double)estimatedProgress
以更新进度条。加载视图后,计时器无效并删除进度条。
答案 2 :(得分:0)
WebKit发布WebViewProgressEstimateChangedNotification和朋友给你这个信息