Как вы сохраняете значения Color Picker в UserDefaults в SwiftUI? - PullRequest
0 голосов
/ 07 августа 2020

Мне назначен массив цветов, который я хочу сохранить в UserDefaults. У меня по умолчанию серый, зеленый, оранжевый и красный, но я хочу разрешить палитре цветов менять зеленый, оранжевый и красный. Значение по умолчанию работает и отображается в моем симуляторе, но когда я пытаюсь изменить цвет в массиве, я получаю сообщение об ошибке «Попытка вставить объект, не относящийся к списку свойств (\ n« 50% серый », \ n зеленый, \ n» kCGColorSpaceModelRGB 0.647194 0.881984 0.980039 1 ", \ n красный \ 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)
      }
}
...