2

Here is my code from my app called Reminders:

Folder Class:

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
}

Main 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)
    }
}

I am trying to save and load my folder objects array at different various points in my program. At the moment it is giving this error:

NSForwarding: warning: object 0x280e3c600 of class 'Reminder.Folder' does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector -[Reminder.Folder replacementObjectForKeyedArchiver:]

I have looked everywhere to try fix this please could someone help, thank you!

2 Answers2

1

Your Folder Model class need Inherits from NSObject and to adopt the protocol and its required methods for store data in UserDefaults.

like this:

class Folder: NSObject {

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

    init (name: String, labelName: String .....)
    {
        self.name = name
        self.labelName = labelName
        ......
    }
}
Sabbir Ahmed
  • 333
  • 1
  • 12
0

Your Folder class needs to be inherits from NSObject and NScoding and protocol required with encoder an Decoder

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)
    }
}