iOS 9.3 使用 SpriteKit 时出现 NSInvalidUnarchiveOperationException
NSInvalidUnarchiveOperationException On iOS 9.3 With SpriteKit
因此,我正在为我一直在开发的一款主要游戏制作一些小项目,但不知道为什么,每次我尝试 运行 我的游戏时,都会出现 SIGABRT 错误提示,并显示以下消息:
* Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (GameScene) for key (root); the class may be defined in source code or a library that is not linked'
我已将以下扩展添加到 SKNode
extension SKNode {
class func unarchiveFromFile(_ file: NSString) -> SKNode? {
if let path = Bundle.main().pathForResource(file as String, ofType: "sks") {
do {
let sceneData = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.dataReadingMappedIfSafe)
let archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
archiver.finishDecoding()
return scene
} catch {
print("ERROR1002")
return nil
}
} else {
print("ERROR001 - pathForResource not found")
return nil
}
}
}
我在其他项目中使用过此扩展程序,所有东西 运行 都很有魅力,但现在在这个项目上。
当我的游戏启动时,我的 GameViewController.swift 文件被调用,并且在我的 viewDidLoad 方法上我执行以下操作:
import UIKit
import SpriteKit
import GameplayKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile(currentSKSFile) as? GameScene {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .aspectFill
skView.presentScene(scene)
}
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if UIDevice.current().userInterfaceIdiom == .phone {
return .landscape
} else {
return .all
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
print("didReceiveMemoryWarning ERRO - GameViewController.swift")
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
我已经调试了代码,它在扩展中的以下行崩溃了 class 我添加了:
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
并提示上述错误
我是 运行ning Xcode 8 Beta + iOS 10,不,不是因为这个,因为我可以 运行 完全相同的扩展在此类设备上使用Beta版本的其他项目没有任何错误。
关于可能导致此问题的原因的任何提示?
问候 - 伊万
清理我的项目解决了我的问题!
我尝试了不同的东西,但错误仍然存在,所以我清理了它,错误不再存在。
我不知道为什么会这样,但是已经解决了。
还是谢谢你:)
因此,我正在为我一直在开发的一款主要游戏制作一些小项目,但不知道为什么,每次我尝试 运行 我的游戏时,都会出现 SIGABRT 错误提示,并显示以下消息:
* Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '* -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (GameScene) for key (root); the class may be defined in source code or a library that is not linked'
我已将以下扩展添加到 SKNode
extension SKNode {
class func unarchiveFromFile(_ file: NSString) -> SKNode? {
if let path = Bundle.main().pathForResource(file as String, ofType: "sks") {
do {
let sceneData = try Data(contentsOf: URL(fileURLWithPath: path), options: NSData.ReadingOptions.dataReadingMappedIfSafe)
let archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
archiver.finishDecoding()
return scene
} catch {
print("ERROR1002")
return nil
}
} else {
print("ERROR001 - pathForResource not found")
return nil
}
}
}
我在其他项目中使用过此扩展程序,所有东西 运行 都很有魅力,但现在在这个项目上。
当我的游戏启动时,我的 GameViewController.swift 文件被调用,并且在我的 viewDidLoad 方法上我执行以下操作:
import UIKit
import SpriteKit
import GameplayKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene.unarchiveFromFile(currentSKSFile) as? GameScene {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .aspectFill
skView.presentScene(scene)
}
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if UIDevice.current().userInterfaceIdiom == .phone {
return .landscape
} else {
return .all
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
print("didReceiveMemoryWarning ERRO - GameViewController.swift")
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
我已经调试了代码,它在扩展中的以下行崩溃了 class 我添加了:
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! GameScene
并提示上述错误
我是 运行ning Xcode 8 Beta + iOS 10,不,不是因为这个,因为我可以 运行 完全相同的扩展在此类设备上使用Beta版本的其他项目没有任何错误。
关于可能导致此问题的原因的任何提示?
问候 - 伊万
清理我的项目解决了我的问题!
我尝试了不同的东西,但错误仍然存在,所以我清理了它,错误不再存在。
我不知道为什么会这样,但是已经解决了。
还是谢谢你:)