我有一个非常基本的类,其中包含一个包含标题(字符串)和颜色(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 数组,这应该是一个字典吗?
提前致谢
编辑:
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)
}
关于ios - 如何为 plist 文件中的 UIColor 设置默认的 NSUserDefaults 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44134151/