SwiftUI 性能问题显示嵌入在 ScrollView 中的 ForEach 循环中的项目中的条件视图

问题描述 投票:0回答:1

使用 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 属性。有没有更好的方法在我的列表中隐藏或显示这些标志?非常感谢任何帮助找出性能问题的帮助!

performance if-statement foreach swiftui scrollview
1个回答
0
投票

因为您在使用

var id = UUID()
时犯了很大的错误,在这种情况下,此集合中的任何更改都会再次渲染所有列表项。 永远不要在
var id = UUID()
中做
Identifiable
,集合是任何小变化的值类型 - 并且您会使用新的
UUID()
重新创建所有项目,SwiftUI 看到这个新的
id
并决定应该从头开始渲染视图!

© www.soinside.com 2019 - 2024. All rights reserved.