2014-08-27 42 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中的編輯器正在破壞文件。