使用 SwiftUI:
我在使用 ForEach 循环创建的 ScrollView 中有一个视图列表。我想根据我用作列表中对象模型的结构中的 4 个不同的 Bool 属性来显示或隐藏一些小标志。我遇到的问题是添加的 If 语句越多,性能就越差。如果没有 If 语句,列表加载会顺利进行。我遇到了这个问题,列表中只有 120 个项目。我很乐意帮助找出我做错了什么!
这是带有 ScrollView 和循环的内容视图的示例:
struct ContentView: View {
@ObservedObject var model = Model()
var body: some View {
ScrollView(.vertical, showsIndicators: true){
VStack(spacing: 10){
ForEach(model.list){ item in
ItemView(item: item)
}
}
}
}// end body
} // end struct
以及我用作模型的项目视图和结构。
struct ListData: Identifiable {
var id = UUID()
var title: String
var subtitle: String
var isTrue: Bool
var isAlsoTrue:Bool
}
struct ItemView: View {
var item: ListData
var body: some View {
VStack(alignment: .leading){
Text(item.title)
HStack{
if item.isTrue{
FlagView(text: "True")
}
if item.isAlsoTrue{
FlagView(text: "Also")
}
Text(item.subtitle)
Spacer()
}
.font(.system(size: 12, weight: .semibold))
}
.font(.system(size: 14, weight: .semibold))
}
}
struct FlagView: View {
var text: String
var body: some View {
Text(text)
.padding(2)
.foregroundColor(.white)
.background(RoundedRectangle(cornerRadius: 2).foregroundColor(.gray))
}
}
实际对象有 4 个我想使用的 Bool 属性。有没有更好的方法在我的列表中隐藏或显示这些标志?非常感谢任何帮助找出性能问题的帮助!
因为您在使用
var id = UUID()
时犯了很大的错误,在这种情况下,此集合中的任何更改都会再次渲染所有列表项。
永远不要在 var id = UUID()
中做 Identifiable
,集合是任何小变化的值类型 - 并且您会使用新的 UUID()
重新创建所有项目,SwiftUI 看到这个新的 id
并决定应该从头开始渲染视图!