首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的SKTileMapNode类型的对象没有被解码?

为什么我的SKTileMapNode类型的对象没有被解码?
EN

Stack Overflow用户
提问于 2018-01-16 01:26:17
回答 1查看 94关注 0票数 1

在自定义类:class BoardTileManager:NSObject, NSCoding {中,我按如下方式实现了NSCoding的方法:

代码语言:javascript
复制
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"

}

和补充的init函数:

代码语言:javascript
复制
    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)!)
    }

    }

问题是,在解码时,所有的数据对象都是空的。但是,如果我检查键是否有值,它将返回true。运行断点,调用encode函数和所需的init。为什么我的数据是空的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 10:23:30

对于遇到这个问题的任何人来说,我花了大半天的时间来解决这个问题,但没有找到任何幸运的东西。然而,我发现更大的问题在我的SKScene中。我的自定义类被编码和解码为场景的一部分。解决方案是在我的场景中使用NSKeyedArchiver,如下所示:

代码语言:javascript
复制
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)
}

然后解压:

代码语言:javascript
复制
vc.gameScene = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? GameScene

看起来,如果我们使用coderdecoderSpritekit类型会因为一些奇怪的原因而不能得到正确的处理。但是如果您使用archiver方法,它会处理它们,并且我的SKScene和我的自定义类都被正确地编码和解码。

请注意,我在问题中描述的自定义类中没有更改任何内容,只更改了SKScene的归档。

无论如何,我不知道为什么这样做是可行的,但也许它会拯救一些人!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48267944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档