2016-07-15 32 views
3

所以我有一個自定義對象數組。當我嘗試將數組保存到NSUserDefaults時,我必須將它們歸檔。下面是我在做什麼存檔我的自定義對象的數組:Swift - 使用NSKeyedArchiver保存用戶數據,轉換爲NSArray時出錯

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    //3 

    var allMessages = defaults.objectForKey(UserDefaultsMesssageKey) as! [AddMessageViewController.harassText] 
    var aMessage = AddMessageViewController.harassText(phoneNumber: 0, message: "1", frequency: 1, active: 1) 
    allMessages.append(aMessage) 
    saveMessage(allMessages) 


    return (allMessages.count) 
} 

func archiveMessage(message:[AddMessageViewController.harassText]) -> NSData { 
    let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(message as NSArray) 
    return archivedObject 
} 
func saveMessage(messages: [AddMessageViewController.harassText]) { 
    let archivedObject = archiveMessage(messages) 
    defaults.setObject(archivedObject, forKey: UserDefaultsMesssageKey) 
    defaults.synchronize() 
} 
func retrieveData()-> [AddMessageViewController.harassText]? { 
    if let unarchiveObject = NSUserDefaults.standardUserDefaults().objectForKey(UserDefaultsMesssageKey) as? NSData { 
     return NSKeyedUnarchiver.unarchiveObjectWithData(unarchiveObject) as? [AddMessageViewController.harassText] 
    } 
    return nil 
} 

的流程是:

  1. 在saveMessage號召,通過自定義數組以得到存檔。這裏是數組看起來像GDB的內容。你可以看到它是一個數組,並且它包含1個類對象。

    ([Harass_Your_Kate.AddMessageViewController.harassText]) $R0 = 1 value { [0] = 0x00007fa5ab409600 { ObjectiveC.NSObject = { isa = Harass_Your_Kate.AddMessageViewController.harassText } phoneNumber = 0 message = "1" frequency = 1 active = 1 } }

  2. 的數組被傳遞到archiveMessage。該代碼立即在NSKeyedArchiver方法上失敗。錯誤信息如下:

    [_TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:]: unrecognized selector sent to instance 0x7fa5ab409600 
    

    2016年7月15日16:31:26.019騷擾你的凱特[5858:7847495] * - [的NSKeyedArchiver的dealloc]:警告:釋放的NSKeyedArchiver沒有上過-finishEncoding叫在上面。 2016年7月15日16:31:26.023騷擾你的凱特[5858:7847495] *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是:「 - [_ TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:]:無法識別的選擇發送到實例0x7fa5ab409600

我很欣賞所有的幫助,提前謝謝!

編輯:這是我的對象的定義:

class Text : NSObject { 
    var phoneNumber = 0    //Text address to send to 
    var message: String = ""  //Message to be sent 
    var frequency = 24    //Number of hours between messages (usually a multiple of 24 - 24 = daily) 
    var active = 0     // 0 if cancelled, 1 if active 

    init(phoneNumber: Int, message: String, frequency: Int, active: Int){ 
     self.phoneNumber = phoneNumber 
     self.message = message 
     self.frequency = frequency 
     self.active = active 
    } 
} 
+2

我們需要查看您的自定義對象的NSCoding方法。 ('initWithCoder'和'encodeWithCoder')。 –

+0

我沒有這些東西。 – Ryan

+1

那就是問題所在。然後向我們展示您的自定義類的定義。 (編輯您的問題以添加代碼,不要在評論中發佈) –

回答

3

NSKeyedArchiver通過採取必須由符合NSCoding協議提供方法的優勢序列化對象。它不能自動推斷如何保存自定義類;你必須實現一個自己如下:

class Text : NSObject, NSCoding { 
    var phoneNumber = 0    //Text address to send to 
    var message: String = ""  //Message to be sent 
    var frequency = 24    //Number of hours between messages (usually a multiple of 24 - 24 = daily) 
    var active = 0     // 0 if cancelled, 1 if active 

    init(phoneNumber: Int, message: String, frequency: Int, active: Int){ 
     self.phoneNumber = phoneNumber 
     self.message = message 
     self.frequency = frequency 
     self.active = active 
    } 

    required init?(coder aDecoder: NSCoder) { 
     phoneNumber = aDecoder.decodeInteger(forKey: "phoneNumber") 
     message = aDecoder.decodeObject(forKey: "message") as! String 
     frequency = aDecoder.decodeInteger(forKey: "frequency") 
     active = aDecoder.decodeInteger(forKey: "active") 
    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(phoneNumber, forKey: "phoneNumber") 
     aCoder.encode(message, forKey: "message") 
     aCoder.encode(frequency, forKey: "frequency") 
     aCoder.encode(active, forKey: "active") 
    } 
} 

正如你所看到的,初始化從編碼器讀取並創建和實例,而encode方法保存相關信息的編碼。在這樣一個簡單的類中,它們的實現可能看起來很明顯,但是在更復雜的自定義類型中,需要做出不重要的編碼決定。

+0

謝謝!這很好。我也用CoreData來實現它,這對於存儲自定義信息來說似乎簡單得多 – Ryan

相關問題