2016-12-28 6 views
0

NSCoding機能を使用して本当に新しいです。私はattributedString、特にデリゲートを通過するUIColorのデータの永続性を作成しようとしています。私は、NSCodingプロトコルが準拠している同じクラスで宣言され、初期化されていない値をエンコードするチュートリアルを見つけられませんでした。NSCodingを使用してデリゲートを介して渡された値をエンコードする方法

私は作成したプロトコルに準拠し、渡されたカラー値を属性としてattributedStringに割り当てるメソッドである次のコードを持っています。

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