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

2023-12-20

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

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

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

斯威夫特 5.2 或更高版本

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

extension Numeric {
    var data: Data {
        var bytes = self
        return Data(bytes: &bytes, count: MemoryLayout<Self>.size)
    }
}

extension Data {
    func object<T>() -> T { withUnsafeBytes{$0.load(as: T.self)} }
    var color: UIColor { .init(data: self) }
}

extension UIColor {
    convenience init(data: Data) {
        let size = MemoryLayout<CGFloat>.size
        self.init(red:   data.subdata(in: size*0..<size*1).object(),
                  green: data.subdata(in: size*1..<size*2).object(),
                  blue:  data.subdata(in: size*2..<size*3).object(),
                  alpha: data.subdata(in: size*3..<size*4).object())
    }
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
        var (red, green, blue, alpha): (CGFloat, CGFloat, CGFloat, CGFloat) = (0, 0, 0, 0)
        return getRed(&red, green: &green, blue: &blue, alpha: &alpha) ?
        (red, green, blue, alpha) : nil
    }
    var data: Data? {
        guard let rgba = rgba else { return nil }
        return rgba.red.data + rgba.green.data + rgba.blue.data + rgba.alpha.data
    }
}

extension UserDefaults {
    func set(_ color: UIColor?, forKey defaultName: String) {
        guard let data = color?.data else {
            removeObject(forKey: defaultName)
            return
        }
        set(data, forKey: defaultName)
    }
    func color(forKey defaultName: String) -> UIColor? {
        data(forKey: defaultName)?.color
    }
}

extension UserDefaults {
    var backgroundColor: UIColor? {
        get { 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 UserDefaults 保存 UIColor? [复制] 的相关文章

随机推荐

  • 如何抑制 Jasmine 中跳过的测试的输出

    如果我的场景包含 1000 多个测试 并且只想运行其中的选定部分 我可以使用fdescribe 其余的测试被跳过 这很好 但它们仍然污染控制台输出 如何抑制跳过测试的控制台输出 如果您通过 Karma 运行测试 则可以配置一个规范报告器插件
  • 如何在 pandas 中使用滚动?

    我正在研究下面的代码 Resample interpolate and inspect ozone data here data data resample D interpolate data info Create the rollin
  • Wix 如何隐藏功能选项(无子功能)

    有一个类似的问题 在自定义对话框中编辑上下文菜单 选择树 https stackoverflow com questions 12929930 edit context menu selectiontree in customize dia
  • 创建 NSString 后保留计数

    我正在通过以下方法创建一个 NSString 类型的对象 NSString str NSString alloc initWithString aaaaaaaaaaaaaaa NSLog retain count d str retainC
  • Rails 4+ 最佳实践:删除父级,同时保留子级

    我想保留子记录和层次结构 即使父记录被删除 我看到两个选择 保留现有的父级并利用 deleted at 字段来指示 父母本身不活跃 但关系仍然存在 这将导致许多实际上已失效的父记录被永久存储 嗯 将所有废弃的子记录分配给通用 收集器 僵尸父
  • Celery / RabbitMQ - 找出 No Acks - 未确认的消息

    我正在尝试找出如何获取有关未确认消息的信息 这些存储在哪里 在使用 celery 检查时 似乎一旦消息得到确认 它就会处理完毕 并且您可以跟踪状态 假设您有一个结果后端 那么您可以看到它的结果 但从你应用延迟的那一刻起 直到它被承认它处于黑
  • 匿名方法作为函数结果

    我想要做的是将作为函数结果获得的匿名方法分配给相同类型的变量 Delphi 抱怨无法完成任务 显然 Delphi 的事情我想分配 GetListener 函数而不是同一函数的结果 非常感谢对此的任何帮助 type TPropertyChan
  • 如何仅对筛选数据/可见单元格应用 vlookup 公式

    我已经过滤了 A 列 我需要对 A 列中的可见单元格应用 vlookup 公式 我如何在 vba 中实现这一目标 工作表中的总行数为 30 000 过滤后的行数接近 100 您无需 VBA 只需使用 Excel 数组公式即可解决此问题 但如
  • 用 R 进行向量思考

    我知道 R 处理向量的效率最高 应该避免循环 我很难自学以这种方式实际编写代码 我想要一些关于如何 矢量化 我的代码的想法 下面是为 10 000 个非唯一状态组合创建 10 年样本数据的示例 st 计划1 p1 和计划2 p2 st lt
  • 动画边距底部 Silverlight

    我目前正在处理动画 我有一个隐藏搜索面板的网格 单击搜索按钮会将网格向下移动以显示搜索选项 我让这部分工作的问题是网格视图占用了所有可用空间 因此当搜索栏隐藏时它看起来很好 但如果搜索栏可见 那么网格底部就会离开页面 我一直在尝试使用边距来
  • 403 禁止网络根目录中的符号链接

    我位于 LAMP 堆栈上的共享托管包上 没有 shell 访问权限 我可以使用 PHP 创建符号链接symlink 功能 假设我的网络根目录是 home www user1 public 假设我有一个名为的真实目录 home www use
  • 使用 CircleCI 进行 Selen 测试

    我正在使用 CircleCI 我想运行 Huxley 测试 但为此我需要运行硒服务器 我试图运行 selenium 服务器独立 jar 那不是解决方案 如果您知道的话请帮忙 大多数浏览器测试框架都会为您提供 Selenium 如果您需要运行
  • CSS 浮点逻辑

    我创建了 25 个随机宽度和高度的盒子 其中width height 如图所示 document ready function e for var count 0 count lt 5 count for var iter 0 iter l
  • 数据库设计:1 个表还是 2 个表?

    我见过一些数据库设计 其中帐户表中包含所有用户信息 包括密码 电子邮件 出生日期 名字 姓氏等 我见过其他一些有两张桌子的 用户名 或电子邮件 密码 状态 激活等 组 管理员 所有者 用户等 and 名字 姓氏 出生日期 出生月份 出生年份
  • gcc - 属性 nothrow 有何用途?

    我查看了一些 gcc 属性列表 发现了这个引起了我的注意 nothrow The nothrow attribute is used to inform the compiler that a function cannot throw a
  • Laravel Eloquent 模型根据字段值为 null 或现有的情况进行更新

    我正在尝试像这样更新 Laravel Eloquent 模型 Res Reservations where time id time id gt where date bus date gt where valid config confi
  • 测试 getchar() == EOF 未按预期工作

    我有一个作业 编写一个允许用户输入最多 20 个整数的 C 程序 它将根据哨兵值或达到 20 个整数限制而停止接受数字 然后该程序应该显示这些数字以与输入相反的顺序 我决定将我的哨兵值设为 EOF 或 CTRL D CRTL Z 我的代码有
  • 如何设置文本框中的最大长度为 6 和最小长度为 6? [复制]

    这个问题在这里已经有答案了 考虑
  • 无法“git 推送”。 “Heroku Git 错误”已经持续 4 天了

    正如标题中所述 我无法推送到我的应用程序之一 git Push 到其他应用程序工作正常 因此凭据 密钥设置没问题 错误信息 git push app remote Heroku Git error please try again shor
  • 如何使用 UserDefaults 保存 UIColor? [复制]

    这个问题在这里已经有答案了 我正在尝试对我的代码进行编程 以便如果用户按下夜间按钮 背景将变黑 并在用户关闭应用程序时保持黑色 白天模式也是如此 请注意 我已经对按钮进行了编码 当他们按下它时 所有场景都会更改为该模式 这是我的代码 我需要