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

标签 ios swift nsuserdefaults uicolor

我有一个非常基本的类,其中包含一个包含标题(字符串)和颜色(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 数组,这应该是一个字典吗?

User defaults plist structure

提前致谢

编辑:

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/

相关文章:

ios - Firebase 循环多级节点

swift - 成功登录

SwiftUI,使用 ForEach 的参数导致错误 "Unable to infer closure type"

ios - 在 UITextView 上以编程方式禁用 iOS8 Quicktype 键盘

ios - AVAudioSession outputVolume 未在 iOS 9+ 上更新

ios - pickerView didSelectRow 正在输入错误的 UITextField

ios - 理解 if let 语句的逻辑 - 初始化之前使用的变量

ios - 在 OSX 上使用透明的 mitmproxy 测试 iOS 应用程序的 SSL/TLS 证书验证

ios - 如何在 ios 的 nsuserdefaults 中保存相机捕获的图像

arrays - 在 Swift 中保留一组自定义结构