【发布时间】:2021-05-30 03:23:42
【问题描述】:
我对 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()
}
}
}
【问题讨论】:
-
与
UITableView非常相似。 Cells 被重复使用。您正在修改 cell,但未将值保留在 model 中。在内存中保存 50 个TextViewRow实例效率非常低。@Stateproperty 包装器使属性可变并使其值保持不变,只要视图处于活动状态。 -
@vadian 我原以为 TextViewRow 实例会消失,但是当它们“重新水合”时会保留状态?
-
想象一下它必须保留
List中的值和位置... -
@vadian 很公平,谢谢 - 有没有关于这种行为的文档?我找不到任何提及它。
标签: swiftui swiftui-list