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

时间:2018-01-15 17:26:17

标签: swift sprite-kit nscoding

在自定义类中: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"

}

和补充的init函数:

    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。正在调用运行断点,编码函数和所需的init。为什么我的数据为零?

1 个答案:

答案 0 :(得分:1)

对于遇到这个问题的人,我花了一天的时间来搞清楚这一点并没有找到运气。但是,我发现在我的SKScene中发现了更大的问题。我的自定义类被编码并解码为场景的一部分。解决方案是在我的场景中使用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

似乎如果我们使用coderdecoder Spritekit类型由于任何奇怪的原因而未得到妥善处理。但是如果你使用archiver方法它会处理它们,我的SKScene和我的自定义类都被正确编码和解码。

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

无论如何,我没有回答为什么会这样,但也许它会拯救某人!