Прогресс Бар в Какао - PullRequest
       2

Прогресс Бар в Какао

1 голос
/ 14 марта 2012

У меня очень простое приложение, которое содержит WebView. Этот веб-просмотр загружает приложение HTML5 и занимает некоторое время, пока контент создается внутри веб-обзора.

Я хотел бы показать индикатор выполнения, пока содержимое не завершит загрузку, и показать веб-просмотр, когда содержимое будет готово. Это займет примерно 10 секунд.

??

Ответы [ 3 ]

2 голосов
/ 17 мая 2016

Свифт 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 })
}

Свифт 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")
}

Полное решение

Я создал Фрагмент кода Какао Swift 3 с NSViewController со встроенными WKWebViewController и NSProgressIndicator, так что вы можете посмотреть живой пример.

0 голосов
/ 28 мая 2012

WebKit публикует WebViewProgressEstimateChangedNotification и друзей, чтобы предоставить вам эту информацию

0 голосов
/ 14 марта 2012

Вам необходимо создать класс, соответствующий протоколу WebFrameLoadDelegate, и установить его в качестве делегата для вашего WebView.

Делегаты в Какао являются его шаблоном обратного вызова.Вы создаете класс, который соответствует протоколу, реализует необходимые сообщения и любые необязательные сообщения, которые вам нужны, добавляете этот класс в качестве делегата в основной класс, в вашем случае WebView, и ваш делегат получает сообщения всякий раз, когда что-то происходит в основном классе.

Из вашего делегата вы можете создать таймер, который будет повторяться каждые 1/10 секунды и отправлять основному веб-представлению сообщение - (double)estimatedProgress, чтобы обновить индикатор выполнения.Как только представление будет загружено, сделайте недействительным таймер и удалите индикатор выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...