Определить, как завершить загрузку веб-сайта в webView с помощью Swift в Xcode

Я пытаюсь создать webapp с быстрым в xcode, это мой текущий код:

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? Я имею в виду.. (начальная/конечная нагрузка, текущий url, титульная страница и т.д.)?

(Извините за мой английский).

Ответ 1

Через вызов делегата UIWebView.

Вам нужно настроить ваш webViews delegate на текущий контроллер и соответствовать протоколу UIWebViewDelegate. Когда webView завершит загрузку, страница func webViewDidFinishLoad(_ webView: UIWebView) будет вызвана.

Ответ 2

Для WKWebview существует также wknavigationdelegate didfinish, но не выполняет трюк как вопрос SO WKWebView не завершил загрузку, когда вызывается функция "УдалитьFinishNavigation" - ошибка в WKWebView?, и этот ответ показать.

Я также обнаружил, что загружаемая страница очень сложна и динамична, UIWebview webViewDidFinishLoad(- webView: UIWebView) также не работает.

И я считаю, что использовать native swift или objective-c для обнаружения при загрузке страницы - это плохой выбор. Более гибкий и эффективный способ - использовать javascript для вызова собственного быстрого кода при загрузке страницы. Что еще это работает для конкретного доминирования, заканчивающего событие загрузки и очень динамичного контента.

Для того, чтобы быстро вызвать javascript, обратитесь к этому сообщению .

Вот пример кода для динамического содержимого с ангулярными символами.

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")
    }

Здесь я используйте angularjs для проверки готового элемента, вы также можете переписать или check-if-a-given-dom -element-ready или jquery-ready-equal-event-listener-on-elements для больше.