如何在 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
如何在 Xcode 中为 Iphone 应用程序导入字体 [重复]