177 votes

Xcode 9 GM - La prise en charge de WKWebView NSCoding était interrompue dans les versions précédentes

Personne ne sait comment résoudre cette erreur avec Xcode 9 GM? Je suis en train de travailler sur une application faite avec Xcode 8.3, la cible de déploiement est pour iOS 9.3 et je n'ai jamais eu ce problème avant. Je n'ai pas trouver toutes les informations ici ou sur les forums Apple encore :(

Edit: Ce message d'erreur quand je mets un WKWebView dans interface builder, pas si je l'utilise par programmation.

See picture WKWebView Error

Edit 2: bon, c'est finalement pas un bug, voir Quinn réponse ci-dessous pour avoir plus d'informations sur ce comportement. Merci à lui pour l'explication.

173voto

Quinn Taylor Points 29688

L'erreur est le comportement correct, et non pas d'un bug dans Xcode 9. Bien que WKWebView a été introduit dans iOS 8, il y avait un bug dans -[WKWebView initWithCoder:] qui était seulement fixé dans iOS 11, qui toujours s'est écrasé lors de l'exécution et donc empêché la configuration de l'un dans Interface Builder.

https://bugs.webkit.org/show_bug.cgi?id=137160

Plutôt que de permettre aux développeurs de construire quelque chose de l'IB qui serait brisé au moment de l'exécution, c'est une erreur de construction. C'est un inconvénient limitation depuis iOS 11 a été récemment publié, mais il n'y a vraiment aucune autre bonne option.

La solution de contournement pour les anciens de déploiement des objectifs est de continuer à ajouter de la WKWebView dans le code, comme @fahad-ashraf déjà décrit, dans sa réponse:

https://developer.apple.com/documentation/webkit/wkwebview

100voto

Fahad Ashraf Points 881

Ce qui semble être un bug dans Xcode 9 et était également présent dans les bêtas. Vous n'obtiendrez l'erreur de compilation si vous êtes à la création d'un WKWebView par le biais de la table de montage séquentiel. Si vous progmatically créer le WKWebView dans le ViewController fichier de classe, vous devriez être en mesure de construire sur les versions d'iOS ci-dessous iOS 11. Ici est l'approche présentée sur le site web d'Apple pour savoir comment effectuer cette opération:

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

Vous devriez alors être en mesure de mettre en œuvre WKWebView fonctionnalités que vous le feriez normalement.

Source: https://developer.apple.com/documentation/webkit/wkwebview

64voto

mrhevor Points 18

Si vous souhaitez réaliser un UIViewController avec d'autres composants, vous pouvez créer un "conteneur" via le storyboard appelé par exemple 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)
    }
 

63voto

mehul patel Points 716

Si vous avez déplacé à partir d'anciennes cible pour iOS 11.0 et encore, vous obtenez cette erreur, puis les utiliser en dessous de solution.

  1. Aller au Storyboard (Principale.storyboard), cliquez sur n'importe quelle Scène.
  2. Sélectionnez 'Fichier' Inspecteur qui est le côté droit de propriété de la fenêtre de Xcode
  3. Le changement"Construit pour la' valeur 'iOS 11.0 et plus Tard'
  4. Compiler et générer des

enter image description here

18voto

Najam Points 559

J'ai rencontré le même problème mais il peut être s'attaquer si l'on ajoute WKWebView par programmation.

  1. Faire quelle que soit la conception que vous voulez faire dans le storyboard, mais quitter la chambre pour WKWebView, dans la région de drag & drop d'une vue, et le nom que webViewContainer et de déclarer ces deux propriétés,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  2. Maintenant, créer et ajouter des webView comme ceci:

    -(instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        self.webView = [self createWebView];
        self = [super initWithCoder:aDecoder];
        return self;
    }
    

    createWebView fonction est déclarée comme,

    -(WKWebView *)createWebView
    {
         WKWebViewConfiguration *configuration = 
                   [[WKWebViewConfiguration alloc] init];
         return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
    }
    
  3. Maintenant, ajoutez ce nouvellement créé webView pour votre containerView comme ça :

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  4. Enfin, il suffit de charger votre Url comme ceci,

    -(void)webViewLoadUrl:(NSString *)stringUrl
    {
         NSURL *url = [NSURL URLWithString:stringUrl];
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
         [self.webView loadRequest:request];
    }
    

Merci pour la lecture de ce.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X