我是Swift和SwiftUI的新手,所以很抱歉提出这个非常基本的问题。我一定误解了SwiftUI生命周期以及它与@State的交互。
我有一个列表,当你点击行时,它会增加一个计数器。如果我点击一些行项目来增加计数器,向下滚动,然后再次向上滚动-状态再次重置为0。有人能指出我哪里错了吗?非常感谢。
struct TestView : View {
@State private var listItems:[String] = (0..<50).map { String($0) }
var body: some View {
List(listItems, id: .self) { listItem in
TestViewRow(item: listItem)
}
}
}
struct TestViewRow: View {
var item: String
@State private var count = 0
var body: some View {
HStack {
Button(item, action: {
self.count += 1
})
Text(String(self.count))
Spacer()
}
}
}
List
中的项目可能会延迟加载,具体取决于操作系统(macOS与iOS(、列表长度、屏幕上的项目数量等。
如果加载了列表项,然后其状态发生了更改,则如果该项已卸载/重新加载到List
中,则不会将该状态重新分配给该项。
您可以将状态移动到不会卸载的父视图,而不是在每个List
行上存储@State
:
struct ContentView : View {
@State private var listItems:[(item:String,count:Int)] = (0..<50).map { (item:String($0),count:0) }
var body: some View {
List(Array(listItems.enumerated()), id: .0) { (index,item) in
TestViewRow(item: item.item, count: $listItems[index].count)
}
}
}
struct TestViewRow: View {
var item: String
@Binding var count : Int
var body: some View {
HStack {
Button(item, action: {
count += 1
})
Text(String(count))
Spacer()
}
}
}