如何使用UserDefaults保存UIColor? [重复]

问题描述 投票:9回答:2

这个问题在这里已有答案:

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

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

这是我的代码,我将需要保存背景颜色:(我在两个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
}
ios swift sprite-kit nsuserdefaults nskeyedarchiver
2个回答
14
投票

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
投票

最简单的方法是使用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

© www.soinside.com 2019 - 2024. All rights reserved.