我想将一个UIColor对象作为属性存储在Core Data实体上,然后检索它并以与我在该实体上执行其他属性相同的方式使用它.
在我的研究中,虽然文献看起来很稀疏,但我发现这篇文章说该属性应该被指定为"可转换",并且数据应该在使用NSKeyedArchiver和出现时手动转换NSKeyedUnarchiver.
但后来,我找到了一篇更新的帖子说,所有必要的是将UIColor保存为CD中的Transformable属性,生成一个Managed Object子类,并像其他属性一样使用.
在苹果文档本身进入一些细节上的存储和检索NSColor上的对象,而不是(我能找到)UIColor.但是,它听起来像归档/取消归档在CD中自动处理.也许.我被这条线弄糊涂了:
如果您在Xcode中使用模型编辑器,请在属性的"类型"弹出窗口中选择"可变换",然后在"值变换器名称"文本字段中键入名称.
我假设他们正在谈论属性的名称,但我不确定,特别是因为它警告明确指定变换器可能引起的问题:
要点:虽然默认转换器是NSKeyedUnarchiveFromDataTransformerName指定的转换器,但实际上反向使用此转换器.如果明确指定默认转换器,Core Data将"以错误的方向"使用它.
我已经达到了这样的程度:我有一个名为"color"的新的可转换属性(没有命名变换器)并且生成了一个包含新"color"属性(类型id)的新子类文件.
我只是简单地困惑.有人可以给我一些关于如何从这里开始的明确指导吗?
如果重要的话,我正在使用MagicalRecord与Core Data进行交互.
非常感谢您的帮助!
在UIKit中,我们可以使用扩展将十六进制颜色设置为几乎所有内容。 https://www.hackingwithswift.com/example-code/uicolor/how-to-convert-a-hex-color-to-a-uicolor
但是当我尝试在SwiftUI上执行此操作时,这是不可能的,看起来SwiftUI没有将UIColor作为参数。
Text(text)
.color(UIColor.init(hex: "FFF"))
Run Code Online (Sandbox Code Playgroud)
错误信息:
Cannot convert value of type 'UIColor' to expected argument type 'Color?'
Run Code Online (Sandbox Code Playgroud)
我什至尝试为Color而不是进行扩展UIColor,但我没有任何运气
我对颜色的扩展:
导入SwiftUI
extension Color {
init(hex: String) {
let scanner = Scanner(string: hex)
scanner.scanLocation = 0
var rgbValue: UInt64 = 0
scanner.scanHexInt64(&rgbValue)
let r = (rgbValue & 0xff0000) >> 16
let g = (rgbValue & 0xff00) >> 8
let b = rgbValue & 0xff
self.init(
red: CGFloat(r) / 0xff,
green: CGFloat(g) / 0xff,
blue: CGFloat(b) / 0xff, …Run Code Online (Sandbox Code Playgroud) 我提出了以下解决方案,但想知道是否有人采用更清晰的方法(在Xcode-Playground中测试):
let colors = CGColorGetComponents( UIColor.greenColor().CGColor )
let hexCol:String = NSString(format: "#%02x%02x%02x", Int(colors[0] * 255.0), Int(colors[1] * 255.0), Int(colors[2] * 255.0))
Run Code Online (Sandbox Code Playgroud)
resulting in #00ff00
其中UIColor.greenColor()是任何UIColor的示例.
编辑:摘自莱昂纳多的答案,我觉得有点重构(他的所有测试仍然适用).
extension UIColor {
typealias RGBComponents = (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
typealias HSBComponents = (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat)
var rgbComponents:RGBComponents {
var c:RGBComponents = (0,0,0,0)
if getRed(&c.red, green: &c.green, blue: &c.blue, alpha: &c.alpha) {
return c
}
return (0,0,0,0)
}
var cssRGBA:String {
return String(format: "rgba(%d,%d,%d, %.02f)", …Run Code Online (Sandbox Code Playgroud)