如何使用NSCoding对通过委托传递的值进行编码

时间:2016-12-28 10:53:40

标签: ios swift cocoa-touch delegation nscoding

我真的很喜欢使用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如何与代表合作提供指导?任何帮助将不胜感激:)

1 个答案:

答案 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