Xcode 9 GM – WKWebView NSCoding支持在以前的版本中被打破

有谁知道如何解决这个错误与Xcode 9 GM? 我正在使用Xcode 8.3制作的应用程序,部署目标是针对iOS 9.3,之前从未遇到过这个问题。 我没有在这里或在苹果论坛上find任何信息呢:(

编辑:当我把一个WKWebView到接口生成器,而不是如果我以编程方式使用它,这个错误。

看到图片WKWebView错误

编辑2:嗯,它终于不是一个错误,请参阅下面的Quinn的答案有关于此行为的更多信息。 感谢他的解释。

错误是正确的行为,而不是Xcode 9中的错误。尽pipeWKWebView是在iOS 8中引入的,但是WKWebView中只有在iOS 11中修复了一个bug,在运行时它总是在-initWithCoder上崩溃,从而阻止了configuration在Interface Builder中。

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

而不是让开发人员在运行时打破IB的东西,这是一个构build错误。 这是一个不方便的限制,因为iOS 11才刚刚发布,但实际上没有其他好的select。

旧的部署目标的解决方法是继续在代码中添加WKWebView,如@ fahad-ashraf在他的回答中已经描述的那样:

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

这似乎是Xcode 9中的一个bug,也出现在beta中。 如果您通过故事板创buildWKWebView,则只会出现构build错误。 如果您在相应的ViewController类文件中逐步创buildWKWebView,则应该能够在iOS 11以下的iOS版本上构build。以下是苹果网站上提供的有关如何完成此操作的方法:

 import UIKit import WebKit class ViewController: UIViewController, WKUIDelegate { var webView: WKWebView! override func 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) }} 

您应该能够像平常一样实现WKWebViewfunction。

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

如果你想用其他组件实现一个自定义的UIViewController ,你可以通过一个叫做例如webViewContainer的故事板创build一个“容器”:

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

我遇到了同样的问题,但是如果我们编程方式添加WKWebView ,可以解决这个问题。

  1. 不pipe你想在故事板上做什么样的devise,而是离开WKWebView的空间,在这个区域拖放一个视图并将其命名为webViewContainer,并声明这两个属性,

     @property (weak, nonatomic) IBOutlet UIView *webViewContainer; @property(nonatomic, strong)WKWebView *webView; 
  2. 现在像这样创build和添加webView:

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

    createWebView函数声明为,

     -(WKWebView *)createWebView { WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; } 
  3. 现在将这个新创build的webView添加到您的containerView中,如下所示:

     -(void)addWebView:(UIView *)view { [view addSubview:self.webView]; [self.webView setTranslatesAutoresizingMaskIntoConstraints:false]; self.webView.frame = view.frame; } 
  4. 最后,只需像这样加载你的url,

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

感谢您阅读此。

此方法只适用于某些网站。 我尝试了http://www.google.com并且无法加载。

我也遇到了这个问题,但是当我把开发目标设置为11.0时,项目可以运行,但是错误仍然存​​在。

UIWebView在iOS11中被弃用,而WKWebView只能在iOS11下运行 – 这听起来像是Xcode GM中的一个bug。