无法将CGSize类型的值转换为期望的参数类型NSCoder

时间:2017-01-30 21:14:00

标签: ios swift sprite-kit

我在我的一些程序中遇到了一些这样的错误并且一直试图修复它。示例:当我输入大小而不是编码器时,它会告诉我它不正确并将其更改回编码器。

a()

5 个答案:

答案 0 :(得分:3)

问题在于GameScene对象的初始化...正如错误所暗示的那样。

let gameScene = GameScene(coder: viewSize) //where error is 

当此初始化程序需要NSCoder对象时,您正在传入CGSize对象。我假设GameSceneSKScene的子类,您应该使用

进行初始化
let gameScene = GameScene(size: viewSize)

答案 1 :(得分:3)

为避免写错语法,您可以使用 XCode 自动完成功能。 Control + SpaceBar 会触发XCode的自动完成功能,当您想知道有关像SKScene这样的通用类的可用init方法时,您只需编写:

enter image description here

执行此操作您可以立即查看输入属性和所需类型

关于你的情况,你有一个名为 GameScene 的类,它是SKScene的子类,你尝试制作:

SKScene.init(coder: <#T##NSCoder#>)

很可能你不能传递viewSize作为这个init方法的输入参数。您应该使用init(size: CGSize)方法

<强>详情:

现在我们谈论init(coder: NSCoder)。 将视图状态保存到磁盘的过程称为序列化。反过来是反序列化 - 从磁盘恢复对象的状态。

override func encode(with aCoder: NSCoder) {
    // Serialize your object here
}

override init() {
    super.init()
}

required init?(coder aDecoder: NSCoder) {
    // Deserialize your object here
    fatalError("init(coder:) has not been implemented")
}

您的自定义类需要使用这些方法来与Interface Builder对话,例如故事板的对象,将该对象的状态序列化到磁盘上,并在使用故事板时对其进行反序列化,但如果您不这样做将任何新属性添加到子类中,您也可以避免为子类编写自己的序列化和反序列化代码。

答案 2 :(得分:2)

假设您的GameScene类是SKScene的子类,则它没有带coder标签的初始值设定项。

只需将GameScene(coder: viewSize)更改为GameScene(size: viewSize)

即可

答案 3 :(得分:0)

如果这是一个SpriteKit项目,GameScene类不需要大小,只需要代表场景的.sks文件的名称。 (大小将设置为该文件的属性)  试试这个,它会重置并再次代表游戏场景

  if let scene = GameScene(fileNamed:"GAME_SCENE_FILE_NAME") {
      scene.replayButton.isHidden = true
      let transition = SKTransition.flipHorizontal(withDuration: 0.5)
      scene.scaleMode = .aspectFill
      self.view!.presentScene(scene, transition: transition)
   }

答案 4 :(得分:0)

我在GameViewController.swift中有这一行。它试图让我&#34;纠正&#34;我的代码使用&#34;编码器&#34;而不是&#34;尺寸&#34;和NScoder是类型。:

let scene = GameScene(size: view.bounds.size)

我在GameScene.Swift中注释掉了这部分代码。这解决了我的问题。

/*
    required init?(coder aDecoder: NSCoder) {
        //        theSelf = self

        //        fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder) //VL:4/1/2015 had to comment out for some reason
    }
*/

直觉帮我搞清楚了。我在我的项目中搜索了NSCoder并找到了这个。这基本上改变了GameScene的方式。这个项目至少可以追溯到xcode 6,这可能就是原因。