我正在尝试将自定义类的列表保存到用户默认值,并且我一直收到发送到实例的"无法识别的选择器"保存时出错。从用户默认值获取数组时没有问题。
这是我用来保存到用户默认值的代码。
let userDefaults = UserDefaults.standard
userDefaults.set(NSKeyedArchiver.archivedData(withRootObject: visitors), forKey: "signedInUsers")
userDefaults.synchronize()
访客是一组访客对象。
这是我的访客班。
class Visitor: NSObject {
var name: String = ""
var contactEmail: String = ""
var company: String = ""
var picture: UIImage = UIImage()
var signature: UIImage = UIImage()
var timeIn: String = ""
var timeOut: String = ""
var signedOut: Bool = false
var otherQuestionsWithAnswers: [String] = []
// MARK: NSCoding
override init() {
super.init()
}
init(name: String, contactEmail: String, company: String, picture: UIImage, signature: UIImage,timeIn: String,timeOut: String,signedOut: Bool,otherQuestionsWithAnswers: [String]) {
self.name = name
self.contactEmail = contactEmail
self.company = company
self.picture = picture
self.signature = signature
self.timeIn = timeIn
self.timeOut = timeOut
self.signedOut = signedOut
self.otherQuestionsWithAnswers = otherQuestionsWithAnswers
}
required convenience init?(coder decoder: NSCoder) {
guard let name = decoder.decodeObject(forKey: "name") as? String,
let contactEmail = decoder.decodeObject(forKey: "contactEmail") as? String,
let company = decoder.decodeObject(forKey: "company") as? String,
let timeOut = decoder.decodeObject(forKey: "timeOut") as? String,
let timeIn = decoder.decodeObject(forKey: "timeIn") as? String,
let picture = decoder.decodeObject(forKey: "picture") as? UIImage,
let signature = decoder.decodeObject(forKey: "signature") as? UIImage,
let otherQuestionsWithAnswers = decoder.decodeObject(forKey: "otherQuestionsWithAnswers") as? [String],
let signedOut = decoder.decodeObject(forKey: "signedOut") as? Bool
else { return nil }
self.init(
name: name,
contactEmail: contactEmail,
company: company,
picture: picture,
signature: signature,
timeIn: timeIn,
timeOut: timeOut,
signedOut: signedOut,
otherQuestionsWithAnswers: otherQuestionsWithAnswers
)
}
func encodeWithCoder(coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(contactEmail, forKey: "contactEmail")
coder.encode(company, forKey: "company")
coder.encode(picture, forKey: "picture")
coder.encode(signature, forKey: "signature")
coder.encode(timeIn, forKey: "timeIn")
coder.encode(timeOut, forKey: "timeOut")
coder.encode(signedOut, forKey: "signedOut")
coder.encode(otherQuestionsWithAnswers, forKey: "otherQuestionsWithAnswers")
}
}
感谢帮助表示赞赏。
编辑:
将类更改为固定它。
import Foundation
import UIKit
// a question that the user has to answer
class Visitor: NSObject, NSCoding {
var name: String = ""
var contactEmail: String = ""
var company: String = ""
var picture: UIImage = UIImage()
var signature: UIImage = UIImage()
var timeIn: String = ""
var timeOut: String = ""
var signedOut: Bool = false
var otherQuestionsWithAnswers: [String] = []
// MARK: NSCoding
override init() {
super.init()
}
init(name: String, contactEmail: String, company: String, picture: UIImage, signature: UIImage,timeIn: String,timeOut: String,signedOut: Bool,otherQuestionsWithAnswers: [String]) {
self.name = name
self.contactEmail = contactEmail
self.company = company
self.picture = picture
self.signature = signature
self.timeIn = timeIn
self.timeOut = timeOut
self.signedOut = signedOut
self.otherQuestionsWithAnswers = otherQuestionsWithAnswers
}
required init(coder decoder: NSCoder) {
name = decoder.decodeObject(forKey: "name") as! String
contactEmail = decoder.decodeObject(forKey: "contactEmail") as! String
company = decoder.decodeObject(forKey: "company") as! String
timeOut = decoder.decodeObject(forKey: "timeOut") as! String
timeIn = decoder.decodeObject(forKey: "timeIn") as! String
if let pictureTest = decoder.decodeObject(forKey: "picture") as? UIImage {
picture = pictureTest
} else {
picture = UIImage()
}
if let sigTest = decoder.decodeObject(forKey: "picture") as? UIImage {
signature = sigTest
} else {
signature = UIImage()
}
otherQuestionsWithAnswers = decoder.decodeObject(forKey: "otherQuestionsWithAnswers") as! [String]
signedOut = decoder.decodeBool(forKey: "signedOut")
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
aCoder.encode(contactEmail, forKey: "contactEmail")
aCoder.encode(company, forKey: "company")
aCoder.encode(picture, forKey: "picture")
aCoder.encode(signature, forKey: "signature")
aCoder.encode(timeIn, forKey: "timeIn")
aCoder.encode(timeOut, forKey: "timeOut")
aCoder.encode(signedOut, forKey: "signedOut")
aCoder.encode(otherQuestionsWithAnswers, forKey: "otherQuestionsWithAnswers")
}
}
答案 0 :(得分:0)
您用于编码的功能不正确,必须是func encode(with aCoder: NSCoder){}
而不是func encodeWithCoder(coder: NSCoder) {}
,因此请更改并按预期工作
public func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
aCoder.encode(contactEmail, forKey: "contactEmail")
aCoder.encode(company, forKey: "company")
aCoder.encode(picture, forKey: "picture")
aCoder.encode(signature, forKey: "signature")
aCoder.encode(timeIn, forKey: "timeIn")
aCoder.encode(timeOut, forKey: "timeOut")
aCoder.encode(signedOut, forKey: "signedOut")
aCoder.encode(otherQuestionsWithAnswers, forKey: "otherQuestionsWithAnswers")
}
希望这有帮助
答案 1 :(得分:0)
您的Visitor类应首先从NSObject继承,然后继承NSCoding。如果没有NSCoding,则无法对自定义类进行编码和解码。这是我最近在项目中犯的错误,并且您的编码函数签名不正确。我相信这会解决这个问题。这是更正后的代码:
Swift 3版本: -
class Visitor: NSObject, NSCoding {
var name: String = ""
var contactEmail: String = ""
var company: String = ""
var picture: UIImage = UIImage()
var signature: UIImage = UIImage()
var timeIn: String = ""
var timeOut: String = ""
var signedOut: Bool = false
var otherQuestionsWithAnswers: [String] = []
func encode(with aCoder: NSCoder) {
//... encode here
}