如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?
Posted
技术标签:
【中文标题】如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?【英文标题】:How do you save Color Picker values into UserDefaults in SwiftUI? 【发布时间】:2020-08-06 21:47:15 【问题描述】:我有一组颜色,我想保存到 UserDefaults。我有灰色、绿色、橙色和红色的默认值,但我想允许颜色选择器更改绿色橙色和红色。默认值在我的模拟器中有效并显示,但是当我尝试更改数组中的颜色时,出现错误“尝试插入非属性列表对象(\n“50% 灰色”,\n 绿色,\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)
【问题讨论】:
不,这是因为 Color 不是 NSObject,根本无法放入 UserDefaults 中。您必须将 Color 转换为 UIColor,UIColor 转换为 Data,最后存储到 UserDefaults。还原顺序相反。 这可能会对您有所帮助:Saving UIColor to and loading from NSUserDefaults 和 How do I save a UIColor with UserDefaults? 【参考方案1】:嗨!
我可以在 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)
【讨论】:
以上是关于如何在 SwiftUI 中将颜色选择器值保存到 UserDefaults 中?的主要内容,如果未能解决你的问题,请参考以下文章
来自先前选择器的选择器值 - CoreData/SwiftUI