[英]How do you save Color Picker values into UserDefaults in SwiftUI?
我有一個 colors 數組,我想保存到 UserDefaults。 我有灰色、綠色、橙色和紅色的默認值,但我想允許顏色選擇器更改綠色橙色和紅色。 默認值在我的模擬器中有效並顯示,但是當我嘗試更改數組中的顏色時,出現錯誤“嘗試插入非屬性列表 object (\n "50% gray",\n green,\n " kCGColorSpaceModelRGB 0.647194 0.881984 0.980039 1 ",\n red\n) 用於鍵 SavedColors。 我相信這是因為顏色選擇器試圖插入不同類型的顏色? 看起來它可能正在嘗試插入 CGColor 或 CGColorSpace?
這是我的項目代碼:
import SwiftUI
import Foundation
import Combine
class UserSettings: ObservableObject {
@Published var colors: [Color] {
didSet {
UserDefaults.standard.set(colors, forKey: "SavedColors")
}
}
init() {
self.colors = UserDefaults.standard.object(forKey: "SavedColors") as? [Color] ?? [Color.gray.opacity(0.5), Color.green, Color.orange, Color.red]
}
}
struct CustomizeView: View {
@ObservedObject var savedColors = UserSettings()
var body: some View {
NavigationView {
Form {
if #available(iOS 14.0, *) {
ColorPicker("Select low priority color", selection: $savedColors.colors[1])
} else {
Text("Select low priority color")
}
if #available(iOS 14.0, *) {
ColorPicker("Select normal priority color", selection: $savedColors.colors[2])
} else {
Text("Select normal priority color")
}
if #available(iOS 14.0, *) {
ColorPicker("Select high priority color", selection: $savedColors.colors[3])
} else {
Text("Select high priority color")
}
}.navigationBarTitle("Customize", displayMode: .inline)
}
}
通過在 MacOS 上進行此轉換,我可以節省 SwiftUI 顏色:
extension Color {
/// Explicitly extracted Core Graphics color
/// for the purpose of reconstruction and persistance.
var cgColor_: CGColor {
NSColor(self).cgColor
}
}
extension UserDefaults {
func setColor(_ color: Color, forKey key: String) {
let cgColor = color.cgColor_
let array = cgColor.components ?? []
set(array, forKey: key)
}
func color(forKey key: String) -> Color {
guard let array = object(forKey: key) as? [CGFloat] else { return .accentColor }
let color = CGColor(colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!, components: array)!
return Color(color)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.