2017-02-11 62 views
0

我有一個用戶Class,無論何時應用程序終止,它都使用saveuser()方法。用戶有兩個Arrays的自定義Classes即子類NSObject。這是我的編碼方法。使用NSCoder編碼數組

func encode(with aCoder: NSCoder) { 
    aCoder.encode(self.firstName, forKey: coderKey.fName) 
    aCoder.encode(self.lastName, forKey: coderKey.lName) 
    aCoder.encode(self.bio, forKey: coderKey.bio) 
    aCoder.encode(self.tags, forKey: coderKey.tags) 
    aCoder.encode(self.organizations, forKey: coderKey.orgs) 
    aCoder.encode(self.img, forKey: coderKey.img) 
} 

該應用程序在編碼時崩潰self.tags。我認爲它會做self.organizations相同,因爲它也是arrayNSObjects和可能與self.img因爲它是UIImage。這是我得到的錯誤。

終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是: ' - [Social_Justice.Tag encodeWithCoder:]:無法識別的選擇發送到實例0x60000005efc0'

我應該怎麼做才能解決這個問題呢?如果您需要查看更多代碼,只需發表評論,然後我將進行修改。

+2

您的兩個自定義類還需要實現NSCoding。 –

回答

0

正如David Berry對原文發表評論。您必須確保您嘗試編碼的任何自定義類都符合NSCoder。他們不需要存檔路徑,他們只需要具有編碼和解碼功能。

0

答:

  1. 我假設數組self.tag 小號和self.organization S的內部對象的類名標籤組織

  2. Objective-C使用非常不同的函數調用樣式。如果您看到[ClassName/ObjectName methodName]這與Swift中的ObjectName.function()風格相當,我們暫時把它放在這裏(Swift編譯器將來會更好,希望在調試時不會再看到objctive-C警告)

  3. A 選擇器是Objective-C使用的術語,您可以認爲這是一種方法。因此,這種無法識別選擇錯誤警告告訴你的代碼試圖調用名爲encodeWithCode()方法實際上並沒有對象標籤組織內部存在(在NSCoder系統知道如何編碼的陣列,但是不知道編碼你自己的內部數組對象)

  4. 如果你想使用一個對象在NSCoder系統的5具體類,對象MUST符合的NSCoding協議。這意味着類(標籤組織)必須實現init?(coder: NSCoder)func encode(with: NSCoder)

  5. 4個具體類的NSCoderNSArchiver, NSUnarchiver, NSKeyedArchiver, NSKeyedUnarchiver, and NSPortCoder.

延伸閱讀:

NSCoding/NSKeyed​Archiver By NSHipster

或者:(我的最愛)

Apple Document NSCoder

Apple Document NSKeyedArchiver

Apple Document NSCoding

或者(如果這些文件仍然有點迷惑你)

Hollemans M. 2016,iOS Apprentice第五版教程2覈對清單,第126〜137頁