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.
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 propiedadnavigationDelegate
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 elnavigationDelegate
, 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: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 elnavigationDelegate
deWKWebView
como la propia claseTestWebview
de la siguiente manera:Con estas modificaciones, los métodos delegados
webView(_:didCommit:)
ywebView(_:didFinish:)
deberían llamarse correctamente cuando el sitio web haya terminado de cargar.