保存和检索UIColors到Core Data的最佳方法

时间:2013-06-21 08:26:02

标签: ios core-data uicolor

我可以想到几种方法,例如将每个颜色组件保存为浮点数,将数组保存为可转换的。保存图案图像的颜色可能会稍微复杂一点,但我想你可以将图像的名称保存为字符串并将其插入到创建代码中。

我是否在正确的轨道上,否则一般来说,执行此任务的最佳和最有效的是什么?

2 个答案:

答案 0 :(得分:16)

您可以将UIColor转换为NSData,然后将其存储:

NSData *theData = [NSKeyedArchiver archivedDataWithRootObject:[UIColor blackColor]];

然后您可以将其转换回您的UIColor对象:

UIColor *theColor = (UIColor *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];

<强> UPD:

在关于存储数据的评论中回答您的问题,最简单的方法是将其存储在NSUserDefaults中:

NSData *theData = [NSKeyedArchiver archivedDataWithRootObject:[UIColor blackColor]];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myColor"];

然后回复它:

NSData *theData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *theColor = (UIColor *)[NSKeyedUnarchiver unarchiveObjectWithData:theData];

答案 1 :(得分:5)

我已经通过对代码进行了一些修改,制作了 Swift 3 版本的Oleg的答案。

extension UIColor {
    class func color(withData data:Data) -> UIColor {
         return NSKeyedUnarchiver.unarchiveObject(with: data) as! UIColor
    }

    func encode() -> Data {
         return NSKeyedArchiver.archivedData(withRootObject: self)
    }
}

Swift 5版本的扩展程序

extension UIColor {

     class func color(data:Data) -> UIColor? {
          return try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? UIColor
     }

     func encode() -> Data? {
          return try? NSKeyedArchiver.archivedData(withRootObject: self, requiringSecureCoding: false)
     }
}

<强>用法

var myColor = UIColor.green
// Encoding the color to data
let myColorData = myColor.encode() // This can be saved into coredata/UserDefaulrs
let newColor = UIColor.color(withData: myColorData) // Converting back to UIColor from Data