如何使用UserDefaults保存UIColor?

时间:2015-12-19 01:03:13

标签: ios swift sprite-kit nsuserdefaults nskeyedarchiver

我正在尝试对我的代码进行编程,以便在用户按下夜间按钮时,如果用户关闭应用程序,背景将变为黑色并保持黑色。 (白天模式也一样。)

请注意:我已经编码了按钮,当他们按下按钮时,所有场景都会变为该模式。

这是我的代码,我将需要保存背景颜色:(我在两个if语句中都需要它)

if GlobalData.dayBool == true && GlobalData.night == false {
    backgroundColor = GlobalData.dayColor 
}

if GlobalData.nightBool == true && GlobalData.dayBool == false {
    backgroundColor = GlobalData.nightColor 
}

我的日夜色彩:

struct GlobalData {
    static var score = 0
    static var dayColor = UIColor(red:0.93, green:0.93, blue:0.93, alpha:1.0)
    static var nightColor = UIColor(red:0.10, green:0.10, blue:0.10, alpha:1.0)  
    static var dayBool = true
    static var nightBool = true
}

2 个答案:

答案 0 :(得分:13)

Swift 4.2或更高版本

请注意,这只会将RGBA CGFloat值保存为属性列表中的Data。当使用NSKeyedUnarchiver(NSCoding)的标准方法时,这将使用32个字节(原始数据)而不是424个字节:

extension UserDefaults {
    func set(_ color: UIColor?, forKey defaultName: String) {
        var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
        guard let color = color, color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
        else {
            removeObject(forKey: defaultName)
            return
        }
        let count = MemoryLayout<CGFloat>.size
        set(Data(bytes: &red,   count: count) +
            Data(bytes: &green, count: count) +
            Data(bytes: &blue,  count: count) +
            Data(bytes: &alpha, count: count), forKey: defaultName)
    }
    func color(forKey defaultName: String) -> UIColor? {
        guard let data = data(forKey: defaultName) else {
           return nil
        }
        let size = MemoryLayout<CGFloat>.size
        return UIColor(red:   data[size*0..<size*1].withUnsafeBytes{ $0.pointee },
                       green: data[size*1..<size*2].withUnsafeBytes{ $0.pointee },
                       blue:  data[size*2..<size*3].withUnsafeBytes{ $0.pointee },
                       alpha: data[size*3..<size*4].withUnsafeBytes{ $0.pointee })
    }
}
extension UserDefaults {
    var backgroundColor: UIColor? {
        get {
            return color(forKey: "backgroundColor")
        }
        set {
            set(newValue, forKey: "backgroundColor")
        }
    }
}
UserDefaults.standard.backgroundColor = .red
UserDefaults.standard.backgroundColor  // r 1.0 g 0.0 b 0.0 a 1.0

答案 1 :(得分:-1)

最简单的方法是使用NSUserDefaults

简单示例 -

let defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject("Coding Explorer", forKey: "userNameKey")

在这种情况下,您存储字符串"Coding Explorer",您可以通过键"userNameKey"进行引用。我相信你可以看到如何在解决方案中使用它:P

帮助您入门的好资源here

如果你想要一些更强大的东西,看看CoreData,实现有点复杂。 CoreData可能不是简单状态持久性所需要的,但可能值得研究。

链接here

修改

Here is a great example to look at how you can save the actual color to NSUserData