可可的进度条

时间:2012-03-14 11:41:55

标签: macos cocoa webview

我有一个包含WebView的非常简单的应用程序。此webview加载HTML5应用程序,在webview中构建内容需要一些时间。

我希望在内容完成加载之前显示进度条,并在内容准备好后显示webview。大约需要10秒钟。

...

3 个答案:

答案 0 :(得分:2)

Swift 2.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 })
}

Swift 3

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和朋友给你这个信息