当前位置: 首页 > 面试题库 >

如何使用UserDefaults保存UIColor?

弘靖琪
2023-03-14
问题内容

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

请注意:我已经对按钮进行了编码,当他们按下按钮时,所有场景都会切换到该模式。

这是我的代码,需要保存背景色:(两个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
}

问题答案:

Swift 4.2或更高版本

请注意,这只会将RGBA
CGFloat值另存为属性列表中的“数据”。与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


 类似资料:
  • 我试图将用户图像保存为userDefaults,但我总是收到错误“Thread 1:”尝试插入非属性列表对象(函数)以进行键保存“这是我的代码

  • 问题内容: 我有一个要保存到UserDefaults的结构。这是我的结构 在另一个ViewController中,我有一个UIButton附加到此结构,例如 我想要它,以便每当用户单击该按钮时,它也将结构保存到UserDefaults,以便每当用户退出该应用程序然后将其打开时,它都会被保存。我该怎么做? 问题答案: 在Swift 4中,这几乎是微不足道的。只需将其标记为采用Codable协议,即可

  • 问题内容: 我目前正在尝试将自定义Swift类保存到NSUserDefaults。这是我的游乐场代码: 运行代码时,出现以下错误 执行被中断,原因:信号SIGABRT。 在最后一行(…) 在带有消息的应用程序中,相同的代码也会崩溃 “属性列表对于格式无效:200(属性列表不能包含’CFType’类型的对象)” 有人可以帮忙吗?我在Maverick上使用Xcode 6.0.1。谢谢。 问题答案: 正

  • 问题内容: 如何在Swift中使用UserDefaults保存/检索字符串,布尔值和其他数据? 问题答案: 参考:NSUserdefault objectTypes 商店 取回 去掉 删除所有键 Swift 2及以下 商店 取回 去掉 寄存器 registerDefaults:将registrationDictionary添加到每个搜索列表的最后一项。这意味着在NSUserDefaults在所有其

  • 问题内容: 我这样定义字典: 然后,我试图将其存储在userdefaults中: 但它抛出错误: 问题答案: 用户默认对象只能是的一个实例(或实例的组合) ,,,,,或。 有些斯威夫特类型自动桥接基金类型,例如,,,和彼此桥接。因此,可以将其保存为用户默认设置: 在64位体系结构上, 是 64位整数,而在32位体系结构上,是32位整数。 的固定大小的整数类型,例如是 不 自动桥接。在Swift-

  • 问题内容: 我已经仔细阅读了Python文档提供的信息,但仍然有些困惑。有人可以张贴示例代码来编写新文件,然后使用pickle将字典转储到其中吗? 问题答案: 尝试这个: