我在我的一些程序中遇到了一些这样的错误并且一直试图修复它。示例:当我输入大小而不是编码器时,它会告诉我它不正确并将其更改回编码器。
a()
答案 0 :(得分:3)
问题在于GameScene
对象的初始化...正如错误所暗示的那样。
let gameScene = GameScene(coder: viewSize) //where error is
当此初始化程序需要NSCoder对象时,您正在传入CGSize对象。我假设GameScene
是SKScene
的子类,您应该使用
let gameScene = GameScene(size: viewSize)
答案 1 :(得分:3)
为避免写错语法,您可以使用 XCode 自动完成功能。 Control + SpaceBar 会触发XCode的自动完成功能,当您想知道有关像SKScene这样的通用类的可用init方法时,您只需编写:
执行此操作您可以立即查看输入属性和所需类型。
关于你的情况,你有一个名为 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,这可能就是原因。