如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?

Posted

技术标签:

【中文标题】如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?【英文标题】:How to set a default NSUserDefaults value for a UIColor in a plist file? 【发布时间】:2017-05-23 11:55:44 【问题描述】:

我有一个非常基本的类,其中包含一个包含标题(字符串)和颜色(UIColor)的仪表板项目。

这些值通过以下方法进行编码/解码:

required init(coder aDecoder: NSCoder) 
    self.title = aDecoder.decodeObjectForKey("title") as! String
    self.color = aDecoder.decodeObjectForKey("color") as! UIColor


func encodeWithCoder(aCoder: NSCoder) 
    aCoder.encodeObject(self.title, forKey: "title")
    aCoder.encodeObject(self.color, forKey: "color")

...并通过以下函数访问/持久化:

NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [DashboardItem]


NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(self.dashboardItems), forKey: DASHBOARD_SCREENS)

旁白:这个想法是用户可以创建一个自定义仪表板,允许他们编辑仪表板项目的标题、颜色和各种其他值。

我创建了一个UserDefaults.plist 文件,其中将包含应用程序的默认值,但我不确定如何为 UIColor 设置默认值?

除此之外,我不完全确定我的 plist 结构是否正确。我假设用户默认值的结构应该包含默认值的字典(根),其中 DASHBOARD_SCREENS 是 DashboardItem 的数组,这应该是字典吗?

提前致谢

编辑:

斯威夫特v2.2

XCodev7.3.1

【问题讨论】:

***.com/questions/1748350/… 在这个答案中你可以看到,颜色可以转换成一些字符串。你可以这样做 链接问题的答案不适合这种情况。 【参考方案1】:

您可以尝试不同的方法,例如将颜色的 RGB 值保存在 UserDefaults 中,只需添加 UIColor 的扩展:

斯威夫特 3

extension UIColor 

    //MARK:- Properties
    var redValue: CGFloat return CIColor(color: self).red 
    var greenValue: CGFloat return CIColor(color: self).green 
    var blueValue: CGFloat return CIColor(color: self).blue 
    var alphaValue: CGFloat return CIColor(color: self).alpha 

这些方法将 UIColor 值转换为字符串和反之亦然:

func getColor(color : UIColor) -> String 

    let redComponent = color.redValue
    let greenComponent = color.greenValue
    let blueComponent = color.blueValue
    let alpha = color.alphaValue
    let colorString = String(describing: redComponent) + ":" + String(describing: greenComponent) + ":" + String(describing: blueComponent) + ":" + String(describing: alpha)

    return colorString



func setColor(colorString : String) -> UIColor 

    let colorComponents = colorString.components(separatedBy: ":")
    let redComponent = (colorComponents[0] as NSString).floatValue
    let greenComponent = (colorComponents[1] as NSString).floatValue
    let blueComponent = (colorComponents[2] as NSString).floatValue
    let alpha = (colorComponents[3] as NSString).floatValue

    return UIColor(colorLiteralRed: redComponent, green: greenComponent, blue: blueComponent, alpha: alpha)

现在使用此字符串值存储在 NSUserDefaults 中并取出此字符串值并通过调用 setColor 方法更改回 UIColor。

斯威夫特 2

extension UIColor 

    //MARK:- Properties
    var redValue: CGFloat  return CGColorGetComponents(self.CGColor)[0] 
    var greenValue: CGFloat  return CGColorGetComponents(self.CGColor)[1] 
    var blueValue: CGFloat  return CGColorGetComponents(self.CGColor)[2] 
    var alphaValue: CGFloat  return CGColorGetComponents(self.CGColor)[3] 


func getColor(color : UIColor) -> String 

    let redComponent = color.redValue
    let greenComponent = color.greenValue
    let blueComponent = color.blueValue
    let alpha = color.alphaValue

    let colorString = String(redComponent) + ":" + String(greenComponent) + ":" + String(blueComponent) + ":" + String(alpha)

    return colorString


func setColor(colorString : String) -> UIColor 

    let colorComponents = colorString.componentsSeparatedByString(":")
    let redComponent = (colorComponents[0] as NSString).floatValue
    let greenComponent = (colorComponents[1] as NSString).floatValue
    let blueComponent = (colorComponents[2] as NSString).floatValue
    let alpha = (colorComponents[3] as NSString).floatValue

    return UIColor(colorLiteralRed: redComponent, green: greenComponent, blue: blueComponent, alpha: alpha)

【讨论】:

这可行。但是,我忘了提到我使用的是 Swift 2.2(对不起!)你知道 CIColor(color: self).red|green|blue|alpha 对应的 2.2 是什么吗? 仅供参考 - Swift 2 实现看起来像:let red|green|blue|alpha: CGFloat return CGColorGetComponents(self.CGColor)[0|1|2|3] @Himanshu 可能值得更新您的原始答案,因为它可以帮助其他人更快地找到相关答案:) 我实际上并没有看到你使用的是哪个 swift 版本。 没问题!这是我的错,我没有将版本放在原始问题中。 好的,继续前进。

以上是关于如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中为 TTTAttributedLabel LinkAttributes 添加 NSDictionary UIColor

如何在swift中为边框颜色变化设置动画

如何在 Swift 中为资产颜色设置 alpha

如何在 Xcode 中为 Iphone 应用程序导入字体 [重复]

如何在IntelliJ中为VM设置内存?我是否必须单独设置Tomcat内存选项?

如何在IOS 11中为新的大型条设置渐变颜色的UINavigationbar?