1

如何将UIColor 存储在 CoreData 中而不会丢失64 位?在 32 位上返回正确的 UIColor。

核心数据设置

  • 属性类型:可变形
  • NSManagedObject 子类属性:@NSManaged var color: UIColor?

颜色值存储前

color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

在 64 位上输出例如红色:

0.20000000000000018  

32位输出红色

0.199999928

从 CoreData 检索颜色后

color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

在 64 位上输出例如红色:

0.20000000298023224 

在 32 位上输出红色:

0.199999928

产生的问题

使用 == 的颜色比较在 64 位上失败,因为值略有不同。在 32 位上一切正常,颜色比较成功。

4

2 回答 2

2

分配NSKeyedArchiver.archivedDataWithRootObject(color)给数据变量并将其保存到您的核心数据存储中。

要读取数据,只需分配NSKeyedUnarchiver.unarchiveObjectWithData(colorData)一个颜色变量。


如果您想知道如何比较浮点数,您可以随时参考this

于 2015-05-25T09:33:06.917 回答
1

这解决了我的问题:

  1. 将 CoreData 属性名称设置为我的自定义 NSValueTransformer 子类:MQColorTransformer

  2. 实现了以下 NSValueTransformer 子类(它也将 UIColor 转换为 NSData,就像Schemetrical建议的那样,但它的优点是我仍然可以将 UIColor 分配给我的颜色属性,并且 NSValueTransformer 负责场景背后的转换):

NSValueTransformer 子类

import Foundation
import UIKit

@objc(MQColorTransformer) class MQColorTransformer: NSValueTransformer {

  override class func transformedValueClass() -> AnyClass{
      return NSData.classForCoder()
  }

  override func transformedValue(value: AnyObject!) -> AnyObject {

      // Transform UIColor to NSData
      let color = value as! UIColor

      var red: CGFloat = 0
      var green: CGFloat = 0
      var blue: CGFloat = 0
      var alpha: CGFloat = 0
      color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

      var components:[CGFloat] = [red, green, blue, alpha]
      let dataFromColors = NSData(bytes: components,
          length: sizeofValue(components)*components.count)

      return dataFromColors

  }

  override func reverseTransformedValue(value: AnyObject!) -> AnyObject {

      // Transform NSData to UIColor
      let data = value  as! NSData
      var components = [CGFloat](count: 4, repeatedValue:0)
      var length=sizeofValue(components)

      data.getBytes(&components, length: length * components.count)
      let color = UIColor(red: components[0],
          green: components[1],
          blue: components[2],
          alpha: components[3])

      return color
  }
}
于 2015-05-25T09:57:55.093 回答