Превращение EstimatedProgress / ProgressView в индикатор выполнения в WKWebView - PullRequest
0 голосов
/ 08 ноября 2018

У меня проблемы с выяснением того, как получить ProgressView, который я преобразовал в предполагаемый прогресс в отображаемый индикатор пользовательского интерфейса. В моем выводе я ясно вижу, что он отслеживает данные, но ничего не отображается в пользовательском интерфейсе при запуске теста. Я хочу добавить индикатор в нижней части панели навигации.

class CycleViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

@IBOutlet var webView: WKWebView!
@IBOutlet var progressView: UIProgressView!

override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.applicationNameForUserAgent = "Version/8.0.2 Safari/600.2.5"
    webView = WKWebView(frame: .zero, configuration: webConfiguration)
    webView.uiDelegate = self
    view = webView

    progressView = UIProgressView(progressViewStyle: .default)
    progressView.sizeToFit()
    progressView.progressTintColor = UIColor(red: 255/255, green: 204/255, blue: 0/255, alpha: 1.0)

}

override func viewDidLoad() {
    super.viewDidLoad()

    webView.backgroundColor = UIColor.clear
    webView.backgroundColor = UIColor(red: 0.0196, green: 0.4, blue: 0.2902, alpha: 1.0)
    webView.isOpaque = false

    self.webView.load(NSURLRequest(url: URL(string: "https://jwelsh19.wixsite.com/countryday")!) as URLRequest);

    self.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" {
        print(self.webView.estimatedProgress);
        self.progressView.progress = Float(self.webView.estimatedProgress);        }
}

}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Похоже, вы добавляете индикатор выполнения на экран XIB. Однако вы также заменяете это представление в loadView() на WKWebView, поэтому кажется, что индикатор выполнения становится нулевым.

Как правило, Apple заявляет следующее для loadView() метода:

Этот метод связывает инстанцированное представление из nib-файла со свойством view контроллера представления. Этот метод вызывается системой и предоставляется в этом классе, поэтому вы можете переопределить его, чтобы добавить поведение непосредственно перед или после загрузки пера.

Не вызывайте этот метод. Если вам требуется, чтобы этот метод вызывался, обратитесь к свойству view.

Не вызывайте этот метод из других объектов, если вы не позаботитесь о том, чтобы избежать избыточных вызовов.

В вашем случае вы можете рассмотреть одно из следующих действий вместо выполнения инициализации на loadView():

  1. Поместите инициализацию webView в viewDidLoad(), а затем добавьте оба webView и progressView как подпредставление к представлению
  2. Кроме того, вы также можете просто добавить webView в XIB, чтобы вы не нужно звонить view = webView и перемещать дополнительные webView и progressView конфигурация в viewDidLoad() вместо.
0 голосов
/ 08 ноября 2018

viewDidLoad( ) вызывается, когда представление завершило загрузку, а loadView( ) вызывается, когда представление начинает загружаться. Переместите этот код в ViewDidLoad

//progressView = UIProgressView(progressViewStyle: .default) // remove this line
progressView.sizeToFit()
progressView.progressTintColor = UIColor(red: 255/255, green: 204/255, blue: 0/255, alpha: 1.0)

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

...