Estoy tratando de crear una aplicación web con swift en xcode, este es mi código actual:

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

Tengo una pregunta, ¿cómo puedo determinar el final de carga de la página en webView?

¿Conoce alguna documentación que contenga todas las definiciones de WebView? Quiero decir ... (inicio / finalización de la carga, la URL actual, la página de título, etc.)?

(Lo siento por mi ingles).

13
Mirko Brombin 26 ene. 2015 a las 14:19

2 respuestas

La mejor respuesta

A través de la llamada de delegado UIWebView.

Debe configurar sus webViews delegate al controlador actual y cumplir con el protocolo UIWebViewDelegate. Cuando webView termine de cargar la página, se llamará a func webViewDidFinishLoad(_ webView: UIWebView).

30
Marius Fanu 26 ene. 2015 a las 11:21

Para WKWebview también hay wknavigationdelegate didfinish, pero no funciona como la pregunta SO WKWebView no lo hizo terminar de cargar, cuando se llama didFinishNavigation - Error en WKWebView? y esta respuesta mostrar.

También encontré que cuando la página para cargar es muy complicada y dinámica, UIWebview webViewDidFinishLoad(- webView: UIWebView) tampoco funciona.

Y creo que usar swift nativo u objetivo-c para detectar cuándo se carga la página es una mala elección. La forma más flexible y efectiva es usar javascript para llamar al código swift nativo cuando la página termina de cargarse. Además, esto también funciona para un evento de carga de acabado de dom específico y contenido muy dinámico.

Para saber cómo llamar a swift desde javascript, consulte esta publicación.

Aquí hay un código de muestra para contenido dinámico con angularjs.

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

Aquí uso angularjs para verificar que el elemento esté listo , también puede refter cómo-llamar-a-una-función-después-de-que-un-div-está-listo o comprobar-si-un-elemento-dom-dado-está-listo o jquery-ready-equivalent-event-listener-on-elements para obtener más información.

3
Community 23 may. 2017 a las 12:18