ios - undeclared - Xcode 9 GM: el soporte de WKWebView NSCoding estaba roto en versiones anteriores
wkwebview reference (7)
¿Alguien sabe cómo solucionar este error con Xcode 9 GM? Estoy trabajando en una aplicación hecha con Xcode 8.3, el objetivo de implementación es para iOS 9.3 y nunca antes tuve este problema. Todavía no encuentro ninguna información aquí o en los foros de Apple :(
Editar: Este error se produjo cuando puse un WKWebView en el generador de interfaces, no si lo uso mediante programación.
Edición 2: Bueno, finalmente no es un error, vea la respuesta de Quinn a continuación para obtener más información sobre este comportamiento. Gracias a él por la explicación.
El error es el comportamiento correcto, y no un error en Xcode 9. Aunque WKWebView se introdujo en iOS 8, hubo un error en
-[WKWebView initWithCoder:]
que solo se solucionó en iOS 11, que siempre fallaba en el tiempo de ejecución y por lo tanto impedía la configuración uno dentro de Interface Builder.
https://bugs.webkit.org/show_bug.cgi?id=137160
En lugar de permitir que los desarrolladores creen algo en IB que se rompería en tiempo de ejecución, es un error de compilación. Es una limitación inconveniente ya que iOS 11 se lanzó recientemente, pero realmente no hay otra buena opción.
La solución para los objetivos de implementación anteriores es continuar agregando el WKWebView en el código, como @ fahad-ashraf ya describió en su respuesta:
Esto parece ser un error en Xcode 9 y también estaba presente en las versiones beta. Solo obtendrá el error de compilación si está creando un WKWebView a través del guión gráfico. Si crea progmáticamente WKWebView en el archivo de clase ViewController correspondiente, debería poder construir en versiones de iOS inferiores a iOS 11. Este es el enfoque dado en el sitio web de Apple sobre cómo lograr esto:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
super.loadView()
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}}
Entonces debería poder implementar la funcionalidad WKWebView como lo haría normalmente.
Fuente: https://developer.apple.com/documentation/webkit/wkwebview
Me he enfrentado al mismo problema, pero puede abordarse si agregamos WKWebView mediante programación.
-
Haga el diseño que quiera hacer en el guión gráfico, pero deje espacio para WKWebView , en esa área arrastre y suelte una vista y asígnele el nombre webViewContainer y declare estas dos propiedades,
@property (weak, nonatomic) IBOutlet UIView *webViewContainer; @property(nonatomic, strong)WKWebView *webView;
-
Ahora cree y agregue webView así:
-(instancetype)initWithCoder:(NSCoder *)aDecoder { self.webView = [self createWebView]; self = [super initWithCoder:aDecoder]; return self; }
La función createWebView se declara como,
-(WKWebView *)createWebView { WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; }
-
Ahora agregue este webView recién creado a su containerView, así:
-(void)addWebView:(UIView *)view { [view addSubview:self.webView]; [self.webView setTranslatesAutoresizingMaskIntoConstraints:false]; self.webView.frame = view.frame; }
-
Finalmente, simplemente cargue su URL de esta manera,
-(void)webViewLoadUrl:(NSString *)stringUrl { NSURL *url = [NSURL URLWithString:stringUrl]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; }
Gracias por leer esto.
Si desea realizar un
UIViewController
personalizado
con otros componentes además, puede hacer un "contenedor" a través del guión gráfico llamado, por ejemplo,
webViewContainer
:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var webViewContainer: UIView!
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let webConfiguration = WKWebViewConfiguration()
let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height))
self.webView = WKWebView (frame: customFrame , configuration: webConfiguration)
webView.translatesAutoresizingMaskIntoConstraints = false
self.webViewContainer.addSubview(webView)
webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
webView.uiDelegate = self
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
Si se trasladó de un objetivo anterior a iOS 11.0 y todavía recibe este error, utilice la solución a continuación.
- Vaya a Storyboard (Main.storyboard), haga clic en cualquier escena.
- Seleccione ''Inspector de archivos'', que es la ventana de propiedades del lado derecho de Xcode
- Cambie el valor '' Compilaciones para '' a '' iOS 11.0 y posterior ''
- Compilar y construir
También tengo este problema, pero cuando establezco el objetivo de desarrollo en 11.0, el proyecto puede ejecutarse pero el error sigue ahí.
UIWebView está en desuso en iOS11 y WKWebView solo funciona en iOS11; esto suena como un error en Xcode GM.