es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El delegado de navegación de WKWebView no es llamado.

Estoy teniendo dificultades para que un WKWebView llame a sus métodos delegados, en particular el método ‘didFinish’.

Estoy intentando algo similar a esta publicación generando un informe en PDF utilizando html cargado en un WKWebView:

Sin embargo, al intentar la sugerencia allí, eso no funciona para mí. Tengo un WKWebView creado en una clase separada al controlador de vista que llamará a sus métodos.

Si simplifico las cosas y solo intento cargar un sitio web en el WebView para ver si se llaman los métodos del delegado, no obtengo nada.

Aquí está mi clase de prueba:

import UIKit
import WebKit

class TestWebview: NSObject {

let webView = WKWebView ()

func loadWebsite () {

    print ("LOAD TEST CALLED")

    webView.navigationDelegate = self

    let link = URL(string: "https://www.apple.com")!

    let request = URLRequest(url: link)

    webView.load(request)

 }

}

extension TestWebview: WKNavigationDelegate {


func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    print ("DID COMMIT")
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print ("FINISHED LOADING")
}


}

Y así es como lo estoy llamando en un controlador de vista separado:

override func viewDidLoad() {

super.viewDidLoad()

  let test = TestWebview ()

  test.loadWebsite()

 }

Aunque si coloco un WKWebView como un outlet en un controlador de vista utilizando Storyboards, los métodos delegados sí se llaman. Sin embargo, estoy tratando de evitar esto, ya que no quiero ver un WKWebView en el controlador de vista y quiero mantener todo el código para eso separado en otra clase.

¿Estoy omitiendo algo? Revisar varias publicaciones en Stack Overflow sobre esto no me ha dado ninguna solución aparte de asegurarme de que el delegado de navegación se esté estableciendo, lo cual estoy haciendo. Cualquier ayuda sería muy apreciada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para que WKWebview no llame a los métodos delegados de navegación

    Si tienes dificultades para lograr que un WKWebView llame a sus métodos delegados, específicamente el método didFinishNavigation, debes asegurarte de haber establecido la propiedad navigationDelegate del WKWebView como la clase que cumple con el protocolo WKNavigationDelegate.

    En el código proporcionado, la clase TestWebview es la responsable de cargar el sitio web y configurar el navigationDelegate, pero la clase misma no cumple con el protocolo WKNavigationDelegate.

    Para solucionar este problema, puedes hacer que la clase TestWebview cumpla con el protocolo WKNavigationDelegate agregando los métodos delegados necesarios en una extensión de la clase de la siguiente manera:

    // Agrega esta extensión a la clase TestWebview
    extension TestWebview: WKNavigationDelegate {
      func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        print("DID COMMIT")
      }
    
      func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("FINISHED LOADING")
      }
    }
    

    Recuerda que si estás utilizando una clase separada para el WKWebView, debes establecer la propiedad navigationDelegate del WKWebView como la clase que cumple con el protocolo WKNavigationDelegate. En este caso particular, puedes establecer el navigationDelegate de WKWebView como la propia clase TestWebview de la siguiente manera:

    // Modifica el método loadWebsite en la clase TestWebview para establecer su propiedad navigationDelegate
    func loadWebsite () {       
      print("LOAD TEST CALLED")
    
      webView.navigationDelegate = self // Establece el delegado de navegación aquí.
    
      let link = URL(string: "https://www.apple.com")!
      let request = URLRequest(url: link)
      webView.load(request)
    }
    

    Con estas modificaciones, los métodos delegados webView(_:didCommit:) y webView(_:didFinish:) deberían llamarse correctamente cuando el sitio web haya terminado de cargar.

Comments are closed.