【问题标题】:How to save and load array of objects - Swift 4如何保存和加载对象数组 - Swift 4
【发布时间】:2019-04-04 02:10:33
【问题描述】:

这是我名为 Reminders 的应用中的代码:

文件夹类:

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
}

主要风投:

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:]

我已经到处寻找尝试解决这个问题,请有人帮忙,谢谢!

【问题讨论】:

    标签: class object swift4 saving-data userdefaults


    【解决方案1】:

    您的文件夹类需要继承自 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)
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      像这样:

      class Folder: NSObject {
      
          var name: String
          var labelName: String
          .....
      
          init (name: String, labelName: String .....)
          {
              self.name = name
              self.labelName = labelName
              ......
          }
      }
      

      【讨论】:

      • 我该怎么做?
      • 只是你的Folder类继承了NSObject->类Folder到类Folder:NSObject
      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多