如何为 plist 文件中的 UIColor 设置默认的 NSUserDefaults 值?
How to set a default NSUserDefaults value for a UIColor in a plist file?
我有一个非常基本的 class,其中包含一个包含标题(字符串)和颜色(UIColor)的仪表板项目。
这些值是 encoded/decoded 通过以下方法:
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 的数组,这应该是字典吗?
提前致谢
编辑:
Swift v2.2
XCode v7.3.1
您可以尝试另一种方法,例如将颜色的 RGB 值保存在 UserDefaults 中,只需添加 UIColor 的扩展:
Swift 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。
Swift 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)
}
我有一个非常基本的 class,其中包含一个包含标题(字符串)和颜色(UIColor)的仪表板项目。
这些值是 encoded/decoded 通过以下方法:
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 的数组,这应该是字典吗?
提前致谢
编辑:
Swift v2.2
XCode v7.3.1
您可以尝试另一种方法,例如将颜色的 RGB 值保存在 UserDefaults 中,只需添加 UIColor 的扩展:
Swift 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。
Swift 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)
}