【发布时间】:2020-05-04 19:44:00
【问题描述】:
使用@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
}
它会更新,但按钮不会是动态的。但是,如果我在 ForEach 循环中执行 person.age += 1 而不使用 @State 变量年龄包装器。
错误:“变异运算符的左侧不可变:'person' 是 'let' 常量”
我以为我理解 Struct、Class、@State 的含义……我想不明白……感谢您提供任何解决方案。
【问题讨论】: