我已经初始化了数组
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'
答案 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上的注释。