在我的MacOS和iOS应用程序中,我使用了从这里创建的 colored颜色 :https://uiwjs.github.io/ui-color/,然后是F.E.工作正常.

Color(red: 1.47, green: 1.9, blue: 2.3).opacity(1)

但是,对于某些 colored颜色 ,我希望它们保存在UserDefaults中,并由UserDefaults.Standard方法和@AppStorage进行读/写.

我确实try 过使用,但这会导致运行时错误.

static let infoListRowReadBGColor = Color(red: 2.55, green: 1.71, blue: 1.07).opacity(1)
static let infoListRowUnReadBGColor = Color(red: 2.55, green: 2.12, blue: 1.38).opacity(1)

var defaults = UserDefaults.standard

defaults.setValue(InAppDefaults.infoListRowReadBGColor, forKey: "infoListRowReadBGColor")
defaults.setValue(InAppDefaults.infoListRowUnReadBGColor, forKey: "infoListRowUnReadBGColor")
        

我需要做什么更改才能使用UserDefaults.Default和@AppStore进行读写操作?我在这里的一篇帖子中确实try 了扩展方法,但我想我做了一些非常错误的事情,因为它不适用于@AppStorage.

使用XCode 13和14作为MacOS 12和iOS 15的开发结果.

推荐答案

默认情况下,您不能将Color()存储在UserDefaults中,但可以使用@AppStorage和NSKeyedArchiver来实现此结果.完整的示例和文档来自this article.

创建扩展:

import Foundation
import SwiftUI
import UIKit

extension Color: RawRepresentable {

    public init?(rawValue: String) {
        
        guard let data = Data(base64Encoded: rawValue) else{
            self = .black
            return
        }
        
        do{
            let color = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? UIColor ?? .black
            self = Color(color)
        }catch{
            self = .black
        }
        
    }

    public var rawValue: String {
        
        do{
            let data = try NSKeyedArchiver.archivedData(withRootObject: UIColor(self), requiringSecureCoding: false) as Data
            return data.base64EncodedString()
            
        }catch{
            
            return ""
            
        }
        
    }

}

并像这样使用它:

@AppStorage("colorkey") var storedColor: Color = .black
    
    var body: some View {
        
        VStack{
            ColorPicker("Persisted Color Picker", selection: $storedColor, supportsOpacity: true)
            }
}

Swift相关问答推荐

可编码:将字符串解码为自定义类型(ISO 8601日期,无时间组件)

将`@Environment`值赋给`Binding`参数

MacOS 13-如何使用SwiftUI创建Message.App设置工具栏?

Swift图表';chartXVisibleDomain挂起或崩溃

调度组是否阻止iOS中的主线程?

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

为什么变量不存储在 Swift 的过程数据区中

标有@MainActor 的函数中的异步调用是否也在主线程上运行?

我如何遵守与演员的协议?

从 Swift Vapor Server 中调用 ShazamKit

如何在 Swift 中使用子定义覆盖父类扩展

为什么 SwiftUI 不在工具栏菜单中反映 @State 属性值?

符合协议 - 错误?

Vapor, fluent 使用 PostgreSQL 保存/创建复杂模型

是否可以在 Swift 中创建通用闭包?

Swift 2 中的新 @convention(c):我该如何使用它?

FCM 后台通知在 iOS 中不起作用

playground 导入:没有这样的模块Foo

如何交换快速数组中的元素?

Swift中方法的弃用和其他属性,如何?