Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在NSUserDefaults中存储数组?斯威夫特3_Ios_Swift - Fatal编程技术网

Ios 如何在NSUserDefaults中存储数组?斯威夫特3

Ios 如何在NSUserDefaults中存储数组?斯威夫特3,ios,swift,Ios,Swift,我试图在userDefaults中存储数组,但在运行我的应用程序时出现以下错误: '尝试插入非属性列表对象( “晨星2.事件(标题:可选(\'testtitle\”),位置:可选(\'testlocation\”) )用于关键测试' 这是我的密码: import UIKit class ViewController: UIViewController { @IBOutlet weak var txtTitle: UITextField! @IBOutlet weak va

我试图在userDefaults中存储数组,但在运行我的应用程序时出现以下错误:

'尝试插入非属性列表对象( “晨星2.事件(标题:可选(\'testtitle\”),位置:可选(\'testlocation\”) )用于关键测试'

这是我的密码:

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中存储自定义对象,对象必须

  • 从NSObject继承
  • 符合NSCoding协议
  • 类实现的示例如下所示:

    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,因此,它会给出这种类型的错误。可能重复的