无法在数组中插入我想添加到用户默认值的对象

Posted

技术标签:

【中文标题】无法在数组中插入我想添加到用户默认值的对象【英文标题】:Can't insert object in the array, that I want add to User Defaults 【发布时间】:2015-07-14 14:25:02 【问题描述】:

我已经初始化了数组

    var defaults = NSUserDefaults.standardUserDefaults()
    var initObject: [CPaymentInfo]? = defaults.objectForKey("paymentData") as? [CPaymentInfo]
    if initObject == nil 
        initObject = [CPaymentInfo]()
        defaults.setValue(initObject, forKey: "paymentData")
    
    defaults.synchronize()

我有控制器,它包含两个文本标签和两个按钮:保存和取消(都调用 segue)

    if sender as? UIBarButtonItem == saveButton 
        var defaults = NSUserDefaults.standardUserDefaults()
        var payments: [CPaymentInfo]? = defaults.objectForKey("paymentData") as? [CPaymentInfo]
        var newPaymentItem: CPaymentInfo?
        if discriptionField.hasText() 
            newPaymentItem = CPaymentInfo(value: (valueField.text as NSString).doubleValue, discription: discriptionField.text)
         else 
            newPaymentItem = CPaymentInfo(value: (valueField.text as NSString).doubleValue)
        

        if let newPay = newPaymentItem 
            payments?.insert(newPay, atIndex: 0)
        
        defaults.setObject(payments, forKey: "paymentData")
    

但它不起作用并且应用程序崩溃。 我发现我可以将“付款”设置为键的默认值中的新对象而无需更改 (通过插入注释块)。 我还发现,我只能用 setObject 方法注释行,应用程序也可以工作。我怎样才能做我想做的事?


2015-07-14 20:34:34.403 cash app[15156:1494701] 属性列表无效 格式:200(属性列表不能包含类型的对象 'CFType') 2015-07-14 20:34:34.404 现金应用 [15156:1494701] 尝试 设置一个非属性列表对象( "cash_app.CPaymentInfo" ) 作为关键 paymentData 的 NSUserDefaults/CFPreferences 值 2015-07-14 20:34:34.409 cash app[15156:1494701] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性” 列表对象 ( "cash_app.CPaymentInfo" ) 用于关键的 paymentData'

【问题讨论】:

“应用程序崩溃”,请提供更多详细信息、堆栈跟踪和详细错误消息。 阅读NSUserDefaults 文档。 Quote: 默认对象必须是一个属性列表,即一个实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果您想存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例。 如果您阅读错误消息,它会说明相同的内容。 【参考方案1】:

答案在错误信息中:

Attempt to insert non-property list object ( "cash_app.CPaymentInfo" ) for key paymentData'

您不能将任意类放入属性列表(例如NSUserDefaults)。有一个特定的可接受的类列表。如果您有其他类要存储,则需要将它们转换为可接受的类。

有关将非属性列表类保存为用户默认值的文档,请参阅Storing NSColor in UserDefaults。虽然那篇文章关注的是NSColor,但它适用于任何符合NSCoding 的对象。另请参阅Introduction to Property Lists 上的说明。

【讨论】:

以上是关于无法在数组中插入我想添加到用户默认值的对象的主要内容,如果未能解决你的问题,请参考以下文章

Impala 添加具有默认值的列

是否可以在单个查询中将 x 个默认值插入到空 SQLite 表中?

Swift 将值添加到现有用户默认值

如何在 Go 中将 JSON 对象数组转换为具有默认值的结构数组?

如何创建具有默认值的对象数组?

在准备好的语句中不向列 X 插入值的逻辑 [重复]