为什么我的 SKTileMapNode 类型的对象没有被解码?
Why is my object of type SKTileMapNode not being decoded?
在自定义 class 中:class BoardTileManager:NSObject, NSCoding {
我实现 NSCoding
的方法如下:
func encode(with aCoder: NSCoder) {
aCoder.encode(self.mainBoardMap!, forKey: "BoardTileManager_mainBoardMap")
aCoder.encode(self.tileSelectionBoardMap!, forKey: "BoardTileManager_tileSelectionBoardMap")
aCoder.encode(self.tileWallingBoardMap!, forKey: "BoardTileManager_tileWallingBoardMap")
aCoder.encode(self.tileWallingTextures!.wallType.rawValue, forKey: "BoardTileManeger_tileWallingTextures"
}
和互补的初始化函数:
required init?(coder aDecoder: NSCoder) {
let data = aDecoder.decodeObject(forKey: "BoardTileManager_mainBoardMap")
if aDecoder.containsValue(forKey: "BoardTileManager_mainBoardMap") == true {
print("herro")
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_mainBoardMap") as? SKTileMapNode {
self.mainBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_tileSelectionBoardMap") as? SKTileMapNode {
self.tileSelectionBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_tileWallingBoardMap") as? SKTileMapNode {
self.tileWallingBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManeger_tileWallingTextures") as? Int {
self.tileWallingTextures = TileWallTextures(type: WallType(rawValue: data)!)
}
}
问题是,在解码的时候,所有的数据对象都是nil。但是,如果我检查键是否有值,它 returns 为真。 运行 个断点、编码函数和所需的 init 正在被调用。为什么我的数据是零?
对于遇到此问题的任何人,我花了一天的大部分时间来解决它,但没有找到任何运气。但是,我发现更大的问题出现在我的 SKScene 中。我的自定义 class 作为场景的一部分进行了编码和解码。解决方案是在我的场景中使用 NSKeyedArchiver
,如下所示:
override func encodeRestorableState(with coder: NSCoder) {
self.sceneWasSaved = true
if self.gameState != nil {
coder.encode(self.sceneWasSaved, forKey: "GameViewController_sceneWasSaved")
coder.encode(self.gameState!, forKey: "GameViewController_gameState")
NSKeyedArchiver.archiveRootObject(self.gameScene!, toFile: filePath)
}
super.encodeRestorableState(with: coder)
}
然后取消存档:
vc.gameScene = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? GameScene
如果我们使用 coder
和 decoder
,那么 Spritekit
类型似乎由于任何奇怪的原因而无法正确处理。但是,如果您使用存档器方法,它会处理它们,并且我的 SKScene
和我的自定义 class 都已正确编码和解码。
请注意,我在问题中描述的自定义 class 中未进行任何更改,仅对 SKScene
.
的存档进行了更改
无论如何,我不知道为什么会这样,但也许它会救人!
在自定义 class 中:class BoardTileManager:NSObject, NSCoding {
我实现 NSCoding
的方法如下:
func encode(with aCoder: NSCoder) {
aCoder.encode(self.mainBoardMap!, forKey: "BoardTileManager_mainBoardMap")
aCoder.encode(self.tileSelectionBoardMap!, forKey: "BoardTileManager_tileSelectionBoardMap")
aCoder.encode(self.tileWallingBoardMap!, forKey: "BoardTileManager_tileWallingBoardMap")
aCoder.encode(self.tileWallingTextures!.wallType.rawValue, forKey: "BoardTileManeger_tileWallingTextures"
}
和互补的初始化函数:
required init?(coder aDecoder: NSCoder) {
let data = aDecoder.decodeObject(forKey: "BoardTileManager_mainBoardMap")
if aDecoder.containsValue(forKey: "BoardTileManager_mainBoardMap") == true {
print("herro")
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_mainBoardMap") as? SKTileMapNode {
self.mainBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_tileSelectionBoardMap") as? SKTileMapNode {
self.tileSelectionBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManager_tileWallingBoardMap") as? SKTileMapNode {
self.tileWallingBoardMap = data
}
if let data = aDecoder.decodeObject(forKey: "BoardTileManeger_tileWallingTextures") as? Int {
self.tileWallingTextures = TileWallTextures(type: WallType(rawValue: data)!)
}
}
问题是,在解码的时候,所有的数据对象都是nil。但是,如果我检查键是否有值,它 returns 为真。 运行 个断点、编码函数和所需的 init 正在被调用。为什么我的数据是零?
对于遇到此问题的任何人,我花了一天的大部分时间来解决它,但没有找到任何运气。但是,我发现更大的问题出现在我的 SKScene 中。我的自定义 class 作为场景的一部分进行了编码和解码。解决方案是在我的场景中使用 NSKeyedArchiver
,如下所示:
override func encodeRestorableState(with coder: NSCoder) {
self.sceneWasSaved = true
if self.gameState != nil {
coder.encode(self.sceneWasSaved, forKey: "GameViewController_sceneWasSaved")
coder.encode(self.gameState!, forKey: "GameViewController_gameState")
NSKeyedArchiver.archiveRootObject(self.gameScene!, toFile: filePath)
}
super.encodeRestorableState(with: coder)
}
然后取消存档:
vc.gameScene = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? GameScene
如果我们使用 coder
和 decoder
,那么 Spritekit
类型似乎由于任何奇怪的原因而无法正确处理。但是,如果您使用存档器方法,它会处理它们,并且我的 SKScene
和我的自定义 class 都已正确编码和解码。
请注意,我在问题中描述的自定义 class 中未进行任何更改,仅对 SKScene
.
无论如何,我不知道为什么会这样,但也许它会救人!