我真的很喜欢使用NSCoding功能,我正在尝试创建一个attributesString数据的持久性,特别是通过委托传递的UIColor。我还没有找到一个教程来编码未在符合NSCoding协议的同一个类中声明和初始化的值。
我有以下代码,这是符合我创建的协议的方法,并将传递的颜色值作为属性分配给attributionString。
func didSelectColorCell(color: UIColor) {
let coder = NSCoder.init()
color.encode(with: coder)
noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color)
}
应用程序崩溃,并向我发出警告“无法发送到类NSCoder的抽象对象:创建一个具体的实例!”我真的迷失了如何处理。我不知道如何使本教程http://nshipster.com/nscoding/适应我的方案。
有人可以就如何订购我的想法或NSCoding如何与代表合作提供指导?任何帮助将不胜感激:)
答案 0 :(得分:0)
定义一个类来实现NSCoding协议(Playground示例):
class ColorHelper: NSObject, NSCoding {
var color: UIColor?
init(color: UIColor) {
super.init()
self.color = color
}
required init(coder aDecoder: NSCoder) {
if let color = aDecoder.decodeObject(forKey: "color") as? UIColor {
self.color = color
}
}
func encode(with aCoder: NSCoder) {
aCoder.encode(color, forKey: "color")
}
func save(defaults key: String) -> Bool {
let defaults = UserDefaults.standard
let savedData = NSKeyedArchiver.archivedData(withRootObject: data)
defaults.set(savedData, forKey: key)
return defaults.synchronize()
}
convenience init?(defaults key: String) {
let defaults = UserDefaults.standard
if let data = defaults.object(forKey: key) as? Data,
let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? ColorHelper,
let color = obj.color {
self.init(color: color)
} else {
return nil
}
}
}
let data = ColorHelper(color: .red)
let savedData = NSKeyedArchiver.archivedData(withRootObject: data)
let obj = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? ColorHelper
obj?.color
在您的代码中:
func didSelectColorCell(color: UIColor) {
let helper = ColorHelper(color: color)
helper.save(defaults: "color")
noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color)
}
要阅读已保存的数据:
let color = ColorHelper(defaults: "color")?.color