2016-12-28 41 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 
相關問題