Unrecognized selector sent to instance while archiving data (NSCoding) Unrecognized selector sent to instance while archiving data (NSCoding) ios ios

Unrecognized selector sent to instance while archiving data (NSCoding)


You need to implement NSCoding protocol inside your Furniture object:

- (void)encodeWithCoder:(NSCoder *)aCoder{  [aCoder encodeObject:self.yourpoperty forKey:@"PROPERTY_KEY"];}-(id)initWithCoder:(NSCoder *)aDecoder{  if(self = [super init]){    self.yourpoperty = [aDecoder decodeObjectForKey:@"PROPERTY_KEY"];  }  return self;}

Basically you specify what should be written (encoded) and read from a file (decoded). Usually for each property you want to store in a file, you make same as I did here in an example.


You'll need to implement NSCoding - here is an example with an object called SNStock that has two string properties, ticker and name:

import Foundationclass SNStock: NSObject, NSCoding{  let ticker: NSString  let name: NSString  init(ticker: NSString, name: NSString)  {    self.ticker = ticker    self.name = name  }  //MARK: NSCoding  required init(coder aDecoder: NSCoder) {    self.ticker = aDecoder.decodeObjectForKey("ticker") as! NSString    self.name = aDecoder.decodeObjectForKey("name") as! NSString  }  func encodeWithCoder(aCoder: NSCoder) {    aCoder.encodeObject(ticker, forKey: "ticker")    aCoder.encodeObject(name, forKey: "name")  }  //MARK: NSObjectProtocol  override func isEqual(object: AnyObject?) -> Bool {    if let object = object as? SNStock {      return self.ticker == object.ticker &&        self.name == object.name    } else {      return false    }  }  override var hash: Int {    return ticker.hashValue  }}


For Swift 4.1 (tested code)

import UIKitimport SwiftyJSONclass UserObject: NSObject, NSCoding {    var username: String? = ""    var userID: String? = ""    var user_email: String? = ""    var name: String? = ""    var age: String? = ""    var gender: String? = ""    override init() {        super.init()    }    init(dictionary: JSON) {        //User data initialize...        username = dictionary["username"].stringValue        userID = dictionary["iUserID"].stringValue        user_email = dictionary["email"].stringValue        name = dictionary["name"].stringValue        age = dictionary["age"].stringValue        gender = dictionary["gender"].stringValue    }    required public init(coder aDecoder: NSCoder) {        username = aDecoder.decodeObject(forKey: "username") as? String        userID = aDecoder.decodeObject(forKey: "iUserID") as? String        user_email = aDecoder.decodeObject(forKey: "email") as? String        name = aDecoder.decodeObject(forKey: "name") as? String        age = aDecoder.decodeObject(forKey: "age") as? String        gender = aDecoder.decodeObject(forKey: "gender") as? String    }    func encode(with aCoder: NSCoder) {        aCoder.encode(username, forKey: "username")        aCoder.encode(userID, forKey: "iUserID")        aCoder.encode(user_email, forKey: "email")        aCoder.encode(name, forKey: "name")        aCoder.encode(age, forKey: "age")        aCoder.encode(gender, forKey: "gender")    }}

Note : NSCoding protocol is important