2014-08-27 37 views
1

我试图从一个SKS文件装载SKEmitterNode,我不断收到此错误:SKEmitterNode崩溃

Terminating app due to uncaught exception 
'NSInvalidUnarchiveOperationException', 
reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: 
cannot decode object of class (SKEditorScene)' 

代码:

var explosion = SKEmitterNode.emitterNodeWithName("Explosion") 

retval.addChild(explosion) 

ExtensionMethod:

class func emitterNodeWithName(name: String) -> SKEmitterNode 
{ 
    return NSKeyedUnarchiver.unarchiveObjectWithFile(NSBundle.mainBundle().pathForResource(name, ofType: "sks")!) as SKEmitterNode 
} 

任何想法?

+1

这是由于XCode将.sks文件视为场景并破坏它的错误。它在XCode 6.1 Beta中修复了 – 2014-09-25 04:03:16

回答

3

我有同样的问题,似乎是在当前的测试版中的错误。 这里是一个解决办法:

func particleEmitterWithName(name : NSString) -> SKEmitterNode? 
{ 
    let path = NSBundle.mainBundle().pathForResource(name, ofType: "sks") 

    var sceneData = NSData.dataWithContentsOfFile(path!, options: .DataReadingMappedIfSafe, error: nil) 
    var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) 

    archiver.setClass(SKEmitterNode.self, forClassName: "SKEditorScene") 
    let node = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as SKEmitterNode? 
    archiver.finishDecoding() 
    return node 
} 
+0

这对我有用。谢谢! – 2014-09-01 07:03:14

+0

这个答案很棒。如果您尝试将归档对象从iOS应用传递到其Apple Watch扩展对象,那么'setClass'函数似乎是不可避免的。即使为iOS应用程序和扩展程序编译了相同的自定义类,它也不会在两个二进制文件中获得完全相同的名称,并且我必须使用此答案在Apple Watch扩展中调整其名称。非常感谢你! – Romain 2014-12-22 20:01:22

0

我注意到,碰撞改变粒子发射器编辑器的某些属性后发生。因此,您还可以在Xcode 5中的代码或编辑器中编辑属性以避免崩溃。显然,Xcode 6中的编辑器正在破坏文件。