如何保存和加载对象数组-Swift 4

时间:2018-10-30 23:47:02

标签: class object swift4 saving-data userdefaults

这是我的应用中的代码,该代码称为提醒:

文件夹类:

class Folder
{
    var name: String
    var labelName: String
    var imageName : String
    var colour : ColourTheme
    var colourArray : Array<UIColor>
    var maxNumOfPages : Int
    var text : Array<String>
    var touchID : Bool
    var isNewFolder : Bool

init (name: String, labelName: String, imageName: String, colour: ColourTheme, maxNumOfPages: Int, text: Array<Any>, touchID: Bool, isNewFolder: Bool)
{
    self.name = name
    self.labelName = labelName
    self.imageName = imageName
    self.colour = colour
    self.colourArray = []
    self.maxNumOfPages = maxNumOfPages
    self.text = text as! Array<String>
    self.touchID = touchID
    self.isNewFolder = isNewFolder
}

主VC:

func resetData ()
{
    folderArray.removeAll()

    let folder1 = Folder.init(name: "reminders", labelName: "reminders", imageName: "reminders(bell)(notifications)", colour: .light, maxNumOfPages: 10, text: [""], touchID: false, isNewFolder: false)

    folderArray.append(folder1)
}

func saveData()
{
    let myData = NSKeyedArchiver.archivedData(withRootObject:   folderArray)
    UserDefaults.standard.set(myData, forKey: "folderArrayD")
    print("place saved")
}

func loadData()
{
    let foldersData = UserDefaults.standard.object(forKey: "folderArrayD") as? NSData

    if let foldersData = foldersData
    {
        let folderArray = NSKeyedUnarchiver.unarchiveObject(with: foldersData as Data) as? [Folder]

        if let folderArray = folderArray
    {
        print(folderArray)
    }
}

我正在尝试在程序的不同位置保存和加载文件夹对象数组。 目前,它正在显示此错误:

  

NSForwarding:警告:类'Reminder.Folder'的对象0x280e3c600没有实现methodSignatureForSelector:-前面有麻烦   无法识别的选择器-[Reminder.Folder replacementObjectForKeyedArchiver:]

我到处都想尝试解决此问题,请有人帮忙,谢谢!

2 个答案:

答案 0 :(得分:1)

您的文件夹模型类需要继承自 NSObject ,并采用该协议及其必需的方法将数据存储在UserDefaults中。

像这样:

class Folder: NSObject {

    var name: String
    var labelName: String
    .....

    init (name: String, labelName: String .....)
    {
        self.name = name
        self.labelName = labelName
        ......
    }
}

答案 1 :(得分:0)

您的Folder类需要继承自NSObject和NScoding以及编码器和解码器所需的协议

class Folder: NSObject, NSCoding {
    var name: String
    var labelName: String
    .....
    struct keys {
        static let name = "name"
        static let labelName = "labelName"
    }
    init (name: String, labelName: String .....)
    {
        self.name = name
        self.labelName = labelName
        ......
    }
    required init(coder aDecoder: NSCoder) {
        self.name = aDecoder.decodeObject(forKey: keys.name) as? String ?? ""
        self. labelName = aDecoder.decodeObject(forKey: keys. labelName) as? String ?? ""
    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(self.emailId, forKey: keys.name)
        aCoder.encode(self.userId, forKey: keys.labelName)
    }
}