Xcode 9 GM - WKWebView NSCoding支持在以前的版本中被破坏了

Meh*_*ufi 135 xcode nscoding ios wkwebview

有谁知道如何使用Xcode 9 GM修复此错误?我正在开发一个使用Xcode 8.3制作的应用程序,部署目标是针对iOS 9.3,我之前从未遇到过这个问题.我在这里或Apple论坛上没有找到任何信息:(

编辑:当我将WKWebView放入界面构建器时出现此错误,而不是以编程方式使用它.

见图片WKWebView错误

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

Qui*_*lor 140

错误是正确的行为,而不是Xcode 9中的错误.尽管在iOS 8中引入了WKWebView,但是-[WKWebView initWithCoder:]只有在iOS 11中修复了一个错误,它总是在运行时崩溃,从而阻止在Interface Builder中配置.

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

而不是允许开发人员在IB中构建可能在运行时被破坏的东西,这是一个构建错误.这是一个不方便的限制,因为iOS 11最近才发布,但实际上没有其他好的选择.

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

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

  • 嗨Quinn,我相信在Apple工作的人:-)我也发现了你的bug报告:https://lists.webkit.org/pipermail/webkit-unassigned/2014-September/640090.html谢谢你的支持当我们遇到像这样的行为时,对于像我这样的新开发者来说,这真的很令人惊讶.再次感谢. (3认同)
  • 如果我们也想在 ios10 中支持怎么办?在我的应用程序中,我也需要支持 ios 10。我们如何解决这个问题? (3认同)

小智 85

这似乎是Xcode 9中的一个错误,也存在于测试版中.如果要通过故事板创建WKWebView,则只会出现构建错误.如果您在相应的ViewController类文件中逐步创建WKWebView,您应该能够在iOS 11以下的iOS版本上构建.以下是Apple网站上提供的如何实现此目的的方法:

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)
    }}
Run Code Online (Sandbox Code Playgroud)

然后,您应该能够像往常一样实现WKWebView功能.

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

  • 不要忘记`super.loadView()` (5认同)

Ale*_*ano 55

如果你想要实现与其他组件的自定义UIViewController,你可以通过故事板制作一个"容器",例如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)
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果出现错误“ [LayoutConstraints]无法同时满足约束”,请不要忘记“ webView.translatesAutoresizingMaskIntoConstraints = false”这一行。如果您将其设置为true,它将自动为您的`webView`创建一整套约束,这将与您以编程方式添加的约束发生冲突。[Apple文档](https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco)。 (2认同)

Kam*_*pai 36

如果您从较旧的目标移动到iOS 11.0并仍然收到此错误,请使用以下解决方案.

  1. 转到Storyboard(Main.storyboard),单击任何场景.
  2. 选择"文件检查器",这是Xcode的右侧属性窗口
  3. 将" Build for for "值更改为" iOS 11.0及更高版本 "
  4. 编译和构建

在此输入图像描述

  • @VyachaslavGerchicov:我不了解您,但在行业中,我们确实有一些需要转换为更新技术的旧项目。这么多人面临同样的问题。我已经在答案中提到“如果您从较旧的目标转移”。不要只考虑一种情况。 (2认同)

Naj*_*jam 13

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

  1. 做任何你想在故事板中做的设计,但留出WKWebView的空间,在那个区域拖放一个视图并将其命名为webViewContainer并声明这两个属性,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在创建并添加webView,如下所示:

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

    createWebView函数声明为,

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

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后,只需像这样加载您的Url,

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

感谢您阅读本文.


Mr.*_*ani 5

WebKit 是在iOS 8中引入的,但它发布时出现了一个错误,导致运行时崩溃,如果您使用的是Xcode 9/10,您的项目配置支持低于iOS 11,并且如果您尝试使用界面生成器添加 WKWebView。Xcode 立即显示编译时错误。

\n\n

iOS 11.0之前的WKWebView(之前版本中NSCoding支持被破坏)

\n\n

虽然 WKWebView 是在iOS 8中引入的,但 \xe2\x80\x93[WKWebView initWithCoder:] 中存在一个错误,仅在iOS 11中修复。

\n\n

在此输入图像描述

\n\n

解决方案是您必须通过代码添加 WKWebView(仅当您支持 iOS 11 以下时)。这实际上听起来很奇怪。

\n\n

另一个解决方案是将 Interface Builder Document Builds 选项更改为 iOS 11 及更高版本(如果您\xe2\x80\x99re 从较旧的目标迁移到 iOS 11 并且仍然遇到相同的错误)。

\n