2016-12-28 24 views
0

我真的很新使用NSCoding功能,我试图创建一个归属字符串数据的持久性,尤其是通过委托传递的UIColor。我还没有找到一个教程,该教程对未在NSCoding协议符合的同一类中声明和初始化的值进行编码。如何使用NSCoding对通过委托传递的值进行编码

我有下面的代码,这是符合我创建的协议的方法,并将传递的颜色值作为属性赋值给attributesString。

func didSelectColorCell(color: UIColor) { 
    let coder = NSCoder.init() 
    color.encode(with: coder) 
    noteTextView.setAttributedValueAtSelectedTextRange(NSForegroundColorAttributeName, value: color) 
} 

该应用程序崩溃,并发送给我一个警告“不能发送到类NSCoder的抽象对象:创建具体实例!”我真的很失望如何进行。我不知道如何将本教程http://nshipster.com/nscoding/适用于我的场景。

有人可以请我提供关于如何订购我的想法或NSCoding如何与代表合作的指导?任何帮助,将不胜感激:)

回答

0

定义一个类来实现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