Представление не обновляется с помощью оболочки свойства @State в SwiftUI - PullRequest
0 голосов
/ 04 мая 2020

Представление не обновляется при использовании оболочки @State. Представление обновляется без использования оболочки @State, но должно делать это вручную.

import SwiftUI

struct SwiftUIView: View {
    @ObservedObject var people: People
    var body: some View {
        VStack {
            ForEach(people.peoples){ person in
                HStack{
                    Text("\(person.age)")
                    if person.ismale {
                        Text("Male")
                    } else {
                        Text("Female")
                    }
                    Button(action:{ person.age += 1}){
                        Text("Age+1")
                    }
                }
            }
        }
    }
}

struct Person: Identifiable{
    var id = UUID()
    @State var age: Int
    var ismale = true
}

class People: ObservableObject {
    @Published var peoples: [Person]
    init() {
        self.peoples = [
            Person(age: 10),
            Person(age: 12, ismale: false)
        ]
    }
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView(people: People())
    }
}

По какой-то причине при нажатии кнопки в представлении не происходит никаких изменений.

Если я изменю его на

Button(action:{ **self.people.peoples[0].age += 1** }){
       Text("Age+1")
}
...

struct Person: Identifiable{
    var id = UUID()
    **var age: Int**
    var ismale = true
}

Он обновится, но кнопка не будет динамической c. Однако, если я сделаю person.age += 1 внутри ForEach l oop без оболочки @State для переменной age.

ОШИБКА: «Левая часть оператора мутации не изменяема: 'person' - это константа 'let'»

Я думал, что понимаю, что означает Struct, Class, @State .. . Думаю, нет ... Заранее благодарим за любые решения.

1 Ответ

0 голосов
/ 04 мая 2020

struct передаются по ссылке, поэтому вам не нужно, чтобы @State' as the ObservableObject` уже получил обновление.

Вот Person struct

struct Person: Identifiable{
    var id = UUID()
    var age: Int
    var ismale = true
}

И SwiftUIView. Я удалил оператор If, чтобы код стал немного чище.

ForEach(people.peoples.indices, id: \.self){ index in
    HStack{
        Text("\(self.people.peoples[index].age)")
        Text(self.people.peoples[index].ismale ? "Male" : "Female")
        Button(action:{ self.people.peoples[index].age += 1 }){
            Text("Age+1")
        }
    }
}

...