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

时间:2015-07-14 14:25:02

标签: ios swift cocoa-touch

我已经初始化了数组

    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现金应用[15156:1494701]物业清单无效   对于格式:200(属性列表不能包含类型的对象   'CFType')2015-07-14 20:34:34.404现金应用[15156:1494701]尝试   设置一个非属性列表对象(       “cash_app.CPaymentInfo”)作为关键支付数据的NSUserDefaults / CFPreferences值2015-07-14 20:34:34.409现金应用程序[15156:1494701]   ***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试插入非属性   列表对象(       “cash_app.CPaymentInfo”)用于密钥paymentData'

1 个答案:

答案 0 :(得分:4)

答案在错误消息中:

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

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

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