Ios 如何在NSUserDefaults中存储数组?斯威夫特3
我试图在userDefaults中存储数组,但在运行我的应用程序时出现以下错误: '尝试插入非属性列表对象( “晨星2.事件(标题:可选(\'testtitle\”),位置:可选(\'testlocation\”) )用于关键测试' 这是我的密码:Ios 如何在NSUserDefaults中存储数组?斯威夫特3,ios,swift,Ios,Swift,我试图在userDefaults中存储数组,但在运行我的应用程序时出现以下错误: '尝试插入非属性列表对象( “晨星2.事件(标题:可选(\'testtitle\”),位置:可选(\'testlocation\”) )用于关键测试' 这是我的密码: import UIKit class ViewController: UIViewController { @IBOutlet weak var txtTitle: UITextField! @IBOutlet weak va
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var txtTitle: UITextField!
@IBOutlet weak var txtLocation: UITextField!
@IBOutlet weak var txtDate: UITextField!
@IBOutlet weak var txtTime: UITextField!
var eventsArray = [Event]()
@IBAction func btnSave() {
let savedEvents = UserDefaults.standard.object(forKey: "test")
let event = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!)
if let tempEvents = savedEvents {
eventsArray = tempEvents as! [Event]
eventsArray.append(event)
}
else {
let event = Event(eventTitle: txtTitle.text!, eventLocation: txtLocation.text!)
eventsArray.append(event)
}
UserDefaults.standard.set(eventsArray, forKey: "test")
//print(eventsArray)
}
}
要在UserDefaults中存储自定义对象,对象必须
class Event: NSObject, NSCoding {
private var eventTitle: String!
private var eventLocation: String!
init(eventTitle: String, eventLocation: String) {
self.eventTitle = eventTitle
self.eventLocation = eventLocation
}
override init() {
}
required convenience init?(coder aDecoder: NSCoder) {
self.init()
eventTitle = aDecoder.decodeObject(forKey: "eventTitle") as? String
eventLocation = aDecoder.decodeObject(forKey: "eventLocation") as? String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(eventTitle, forKey: "eventTitle")
aCoder.encode(eventLocation, forKey: "eventLocation")
}
}
现在,您只能在UserDefaults中存储某些对象。幸运的是,类型数据可以存储在UserDefaults中。然后需要将数组转换为数据,然后存储它
let data = NSKeyedArchiver.archivedData(withRootObject: eventsArray)
// This calls the encode function of your Event class
UserDefaults.standard.set(data, forKey: "test")
/* This saves the object to a buffer, but you will need to call synchronize,
before it is actually saved to UserDefaults */
UserDefaults.standard.synchronize()
当您检索数据时,它返回为Any?,必须将其强制转换到您的对象:
if let data = UserDefaults.standard.object(forKey: "test") as? Data {
if let storedData = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Event] {
// In here you can access your array
}
}
您的数组具有自定义对象,这些对象不能自动存储在用户默认值中。在这里看一下如何正确地做到这一点:请在发布之前。您不能将对象直接存储到UserDefaults,因此,它会给出这种类型的错误。可能重复的