WKWebView en Interface Builder

Parece que las plantillas de objetos IB en XCode 6 beta todavía están creando objetos de estilo antiguo (UIWebView para iOS y WebView para OSX). Esperemos que Apple los actualice para el WebKit moderno, pero hasta entonces, ¿cuál es la mejor manera de crear WKWebViews en Interface Builder? ¿Debo crear una vista básica (UIView o NSView) y asignar su tipo a WKWebView? La mayoría de los ejemplos que encuentro en línea lo agregan a una vista de contenedor mediante progtwigción; ¿Es eso mejor por alguna razón?

Tienes razón, parece que no funciona. Si miras en los encabezados, verás:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; 

lo que implica que no puedes crear una instancia de una semilla.

Tendrás que hacerlo a mano en viewDidLoad o loadView.

Como señalaron algunos, a partir de Xcode 6.4, WKWebView todavía no está disponible en Interface Builder. Sin embargo, es muy fácil agregarlos a través del código.

Solo estoy usando esto en mi ViewController. Saltar constructor de interfaz

 import UIKit import WebKit class ViewController: UIViewController { private var webView: WKWebView? override func loadView() { webView = WKWebView() //If you want to implement the delegate //webView?.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() if let url = URL(string: "https://google.com") { let req = URLRequest(url: url) webView?.load(req) } } } 

Xcode 9.1

Puede encontrar el elemento WKWebView en la biblioteca de objetos.

enter image description here

Swift 3 y Xcode 8

usando StoryBoard

ViewController.swift

 import UIKit import WebKit // Add WKWebView in StoryBoard class ViewController: UIViewController { @IBOutlet var webView: WebView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) webView.loadUrl(string: "http://apple.com") } } class WebView: WKWebView { required init?(coder: NSCoder) { if let _view = UIView(coder: coder) { super.init(frame: _view.frame, configuration: WKWebViewConfiguration()) autoresizingMask = _view.autoresizingMask } else { return nil } } func loadUrl(string: String) { if let url = URL(string: string) { load(URLRequest(url: url)) } } } 

Main.storyboard

 < ?xml version="1.0" encoding="UTF-8"?>                                         

programáticamente

 import UIKit import WebKit // Add WKWebView programmatically class ViewController: UIViewController { var webView: WKWebView? override func viewDidLoad() { super.viewDidLoad() // init webView webView = WKWebView(frame: view.bounds) view.addSubview(webView!) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // load url webView?.loadUrl(string: "http://apple.com") } } extension WKWebView { func loadUrl(string: String) { if let url = URL(string: string) { load(URLRequest(url: url)) } } } 

Con Xcode 8 esto ahora es posible, pero los medios para lograrlo son un poco hacky por decir lo menos. Pero bueno, una solución de trabajo es una solución de trabajo, ¿verdad? Dejame explicar.

WKWebView’s initWithCoder: ya no está anotado como “NS_UNAVAILABLE”. Ahora se ve como se muestra a continuación.

 - (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; 

Comience subclasando WKWebView y anule initWithCoder. En lugar de llamar a super initWithCoder, necesitará usar un método init diferente, como initWithFrame: configuration :. Ejemplo rápido a continuación.

 - (instancetype)initWithCoder:(NSCoder *)coder { // An initial frame for initialization must be set, but it will be overridden // below by the autolayout constraints set in interface builder. CGRect frame = [[UIScreen mainScreen] bounds]; WKWebViewConfiguration *myConfiguration = [WKWebViewConfiguration new]; // Set any configuration parameters here, eg // myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll; self = [super initWithFrame:frame configuration:myConfiguration]; // Apply constraints from interface builder. self.translatesAutoresizingMaskIntoConstraints = NO; return self; } 

En su Storyboard, use un UIView y dele una clase personalizada de su nueva subclase. El rest es lo de siempre (establecer restricciones de diseño automático, vincular la vista a una toma de stream en un controlador, etc.).

Finalmente, WKWebView escala el contenido de manera diferente a UIWebView. Es probable que muchas personas deseen seguir los consejos simples de Suprimir WKWebView para escalar el contenido y procesarlo con el mismo aumento que UIWebView para hacer que WKWebView siga más de cerca el comportamiento de UIWebView a este respecto.

Aquí hay una versión simple de Swift 3 basada en la excelente respuesta de crx_au .

 import WebKit class WKWebView_IBWrapper: WKWebView { required convenience init?(coder: NSCoder) { let config = WKWebViewConfiguration() //config.suppressesIncrementalRendering = true //any custom config you want to add self.init(frame: .zero, configuration: config) self.translatesAutoresizingMaskIntoConstraints = false } } 

Cree un UIView en Interface Builder, asigne sus restricciones y asígnele WKWebView_IBWrapper como una clase personalizada, como esta:

Utilidades -/> pestaña del inspector de identidad [1]”></p>
</div>
</li><!-- #comment-## -->
<div class=

Esto ahora está aparentemente arreglado en Xcode 9b4. Las notas de la versión dicen “WKWebView está disponible en la biblioteca de objetos de iOS”.

No he buscado más profundamente para ver si requiere iOS 11 o si aún es compatible con versiones anteriores.

Puede crear instancias y configurar un WKWebView en IB desde Xcode 9, sin necesidad de hacerlo en el código. enter image description here

Tenga en cuenta que su destino de despliegue tiene que ser más alto que iOS 10 o tendrá un error en tiempo de comstackción.

enter image description here

En XCode Versión 9.0.1 WKWebView está disponible en Interface Builder.

Si todavía enfrenta este problema en versiones recientes de Xcode, es decir, v9.2 +, simplemente importe Webkit ViewController:

 #import  
  1. Antes de la corrección: enter image description here

  2. Después de la corrección:

enter image description here

Esto funcionó para mí en Xcode 7.2 …

Primero agregue la vista web como una salida de UIWebView en el guión gráfico / IB. Esto le dará una propiedad como esta:

 @property (weak, nonatomic) IBOutlet UIWebView *webView; 

Luego edite su código para cambiarlo a WKWebView.

 @property (weak, nonatomic) IBOutlet WKWebView *webView; 

También debe cambiar la clase personalizada a WKWebView en el inspector de identidad.