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

标签 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"

}

和互补的初始化函数:

    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 被调用。为什么我的数据为零?

最佳答案

对于遇到此问题的任何人,我花了一天的大部分时间来解决它,但没有找到任何运气。但是,我发现更大的问题出现在我的 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 类型由于任何奇怪的原因都没有得到正确处理。但是,如果您使用存档器方法,它会处理它们,并且我的 SKScene 和我的自定义类都已正确编码和解码。

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

无论如何,我不知道为什么会这样,但也许它会救人!

关于swift - 为什么我的 SKTileMapNode 类型的对象没有被解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48267944/

相关文章:

swift - 将 url 从标记传递到 Controller

swift - Xcode Swift 在 tableView 中显示来自 CloudKit 的数据

ios - 如何在 swift 5.1 中设置 UICollectionView 的标题大小?

swift - SKSpriteNode Overlay 未显示

ios - Swift:NSKeyedArchiver 错误

ios - 读/写数据 NSCoding iOS - Singelton 与否?

Objective-c - initWithCoder 和内存管理?

ios - 将同一 View 从 VC1 传递并显示到 VC2

ios - 缓慢的场景转换

uiview - removeFromSuperview 不适用于添加到 SKScene 的 UIView