Как изменить цвет background с помощью Picker в SwiftUI?


#1

Всем привет, я новичок в SwiftUI, в AddTodoView() через picker выбираю цвет и добавляю эти данные в CoreData и в ContentView() хочу отобразить выбранный цвет
Как мне правильно указать background в ContentView()?

ContentView:

if todoDB.color == "Red"{
     background(Color("Red"))
} else if todoDB.color == "Green"{
     background(Color("Red"))
} else if todoDB.color == "Blue"{
     background(Color("Blue"))
}

AddTodoView:

@State private var color: String = ""
var colors = ["Red", "Green", "Blue"]
Picker(selection: $color,
       label: Text(NSLocalizedString("Color: ", comment: "") + "\(color)")){
    ForEach(colors, id: \.self){
        Text($0)
    }
 }

#2
if todoDB.color == "Red"{
     background(.red)
} else if todoDB.color == "Green"{
     background(.green)
} else if todoDB.color == "Blue"{
     background(.blue)
}

#3

Все равно есть ошибка: “the compiler is unable to type-check this expression in reasonable time”


#4

Проверил у себя в UIKit, все работает.
Либо еще один косяк SwiftUI, либо что-то не так у вас.

Есть еще вариант избавиться от всех условий. Создать enum, при выборе в пикере сохранять его и потом из базы получать этот самый enum, и брать из него цвет.


#5
enum Colors: String {
    case red = "Red"
    case green = "Green"
    case blue = "Blue"

    var color: UIColor {
        switch self {
        case .red: return .red
        case .green: return .green
        default: return .blue
        }
    }
}

#6

в SwiftUI бекграунд принимает View. Поэтому надо явно указывать что за вью - Color.red, потому что там необязательно Color.


#7

Я разобрался, правильнее было сделать так:
.background(Color(todoDB.color ?? “”))


#8

ну я еще SwiftUI не ковырял, мне простительно ))