Я хочу сделать приложение ToDo. Поэтому я сделал список, который берет данные из массива.
Массив работает со структурой и состоит из заголовка (строки) и логического значения, которое проверяет, выполнен ли «квест» или нет.
В ContentView вы можете увидеть список с заголовком и слева от него значок, который меняется в зависимости от того, как логическое значение «готово».
Когда я нажимаю на строку, я хочу, чтобы эта задача была проверена. Но изменить это логическое значение невозможно.
import SwiftUI
struct Quest: Identifiable{
var title: String
var done: Bool
var id: String { title }
}
struct ContentView: View {
var quests: [Quest] = [
Quest(title: "Zimmer aufräumen", done: true),
Quest(title: "Müll rausbringen", done: false),
Quest(title: "Bad putzen", done: false)
]
var done = false
var body: some View {
VStack{
List(quests) { quest in
Button {
quest.done = true. // <- Error
} label: {
HStack{
if done == true {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(Color("checked")) // own Color
Text(quest.title)
.foregroundColor(.gray)
} else {
Image(systemName: "checkmark.circle")
.foregroundColor(Color(.gray))
Text(quest.title)
.foregroundColor(.black)
}
}
}
}
}
}
func done(_ quest: inout Quest) {
quest.done = true
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Я понятия не имею, что я могу сделать сейчас.
Вам нужно использовать @State SwiftUI.
Попробуйте этот подход, используя @State var quests
и List($quests) { $quest...
, он работает для меня.
struct ContentView: View {
// --- here
@State var quests: [Quest] = [
Quest(title: "Zimmer aufräumen", done: true),
Quest(title: "Müll rausbringen", done: false),
Quest(title: "Bad putzen", done: false)
]
var body: some View {
VStack{
List($quests) { $quest in // <--- here
Button {
quest.done.toggle() // <--- here
} label: {
HStack{
if quest.done { // <--- here
Image(systemName: "checkmark.circle.fill")
.foregroundColor(Color("checked")) // own Color
Text(quest.title)
.foregroundColor(.gray)
} else {
Image(systemName: "checkmark.circle")
.foregroundColor(Color(.gray))
Text(quest.title)
.foregroundColor(.black)
}
}
}
}
}
}
}
Для получения дополнительной информации о List
с editable data
см.: https://developer.apple.com/documentation/swiftui/list#listing-editable-data