我真的使用了NSCODing功能,我正在尝试创建属性string的数据的持久性,尤其是通过委托的Uicolor。我还没有找到一个编码未声明和初始化的值的教程,其中Nscoding协议的同一类。
。i具有以下代码,这是符合我创建的协议并将传递的颜色值作为属性属性的方法。
func didSelectColorCell(color: UIColor) {
let coder = NSCoder.init()
color.encode(with: coder)
noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color)
}
该应用程序崩溃,并向我发送警告"无法发送到nScoder类的抽象对象:创建一个具体实例!"我真的很迷失方向。我不知道该如何适应此教程http://nshipster.com/nscoding/为我的场景。
有人可以为我提供有关如何订购我的想法的指导,或者Nscoding如何与代表一起工作?任何帮助将不胜感激:)
定义一个类以实现NScoding协议(游乐场样本):
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