如何为 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)
}