致命错误:尚未实现init(coder :)。运行时错误在哪里

时间:2019-04-27 22:55:22

标签: ios swift sprite-kit init

Picture of code

我不知道如何解决该错误。如果有人理解,请帮忙!

class GameScene: SKScene {
    let player = SKSpriteNode(imageNamed: "playerShip")
    let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)

    var gameArea: CGRect

    override init(size: CGSize)
    {
        let maxAspectRatio: CGFloat = 16.0/9.0
        let playableWidth = size.height/maxAspectRatio
        let margin = (size.width - playableWidth)/2
        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
        super.init(size: size)
    }

    required init?(coder aDecoder: NSCoder)
    {
        fatalError("init(coder:) has not been implemented")
    }

我正在尝试为屏幕上的对象设置边界。当我编写super.init(size: size)时,Xcode自动创建了必需的init?(coder aDecoder: NSCoder),但是运行时我得到了以下错误:

  

线程1:致命错误:init(coder :)尚未实现

2 个答案:

答案 0 :(得分:0)

因为您已使用override init(size: CGSize)方法覆盖了SKScene的指定初始化方法,因此必须实现此required init?(coder aDecoder: NSCoder)方法以允许自定义SKScene类(您的GameScene类)进行对象序列化。

这篇较老的文章可能会帮助您解释一下:

What exactly is init coder aDecoder?

如果您尝试初始化gameArea变量,为什么不尝试尝试在gameArea的覆盖中设置sceneDidLoad()之类的方法呢? (下面的代码确实很糟糕):

class GameScene: SKScene {
    let player = SKSpriteNode(imageNamed: "playerShip")
    let bulletSound = SKAction.playSoundFileNamed("bulletSound.wav", waitForCompletion: false)

    var gameArea: CGRect?

    override func sceneDidLoad() {
        let maxAspectRatio: CGFloat = 16.0/9.0
        let playableWidth = size.height/maxAspectRatio
        let margin = (size.width - playableWidth)/2

        gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)
    }

    <<more of your code>>
}

并消除override init(size: CGSize)

答案 1 :(得分:0)

就像oaccamsrazor指出的那样,如果您向类添加了初始化程序,则还必须在超类中实现任何必需的初始化程序。您击中init?(coder aDecoder: NSCoder)的事实表明init(size: ...)未被调用,可能是因为您是从.sks文件创建场景的。

init?(coder aDecoder: NSCoder)文件创建场景时,会调用

.sks,因此那里没有fatalError()。基本上,如果您有任何要初始化的内容,则只需实际实现您的初始化程序即可。否则,请删除所有初始化程序,并且拥有init?(coder aDecoder: NSCoder)的要求将消失。