【问题标题】:What is the difference between List and ForEach in SwiftUI?SwiftUI 中的 List 和 ForEach 有什么区别?
【发布时间】:2019-10-25 09:09:30
【问题描述】:

我知道 SwiftUI 目前不支持常规的 for 循环,而是提供了一个名为 ForEach 的东西,但它和 List 有什么区别?

【问题讨论】:

标签: swiftui


【解决方案1】:
  • ForEach 是一个视图,可让您将数据集合传递给其初始化程序,然后从您提供的闭包中创建多个“子视图”。它没有关于如何排列视图的任何语义。

    示例:

      ForEach(1..<5) { row in
          Text("Row \(row)")
      }
    

    将创建等效的关闭

      Text("Row 1")
      Text("Row 2")
      Text("Row 3")
      Text("Row 4")
    

    包装在单个容器视图中。

  • List 是可以将多个视图组合在一起的视图,但不一定是相同类型的视图。您可以简单地添加多个视图而无需任何循环。

    示例 1:

      List {
          Image("avatar")
          Text("Title")
          Button(action: {
              print("Button tapped!")
          }) {
              Text("Energize!")
          }
      }
    

    为了方便List 初始化程序允许您像使用 ForEach 视图一样使用它,以防您想要一个仅包含单个单元格类型的列表。

    示例 2:

      List(1..<5) { row in
          Text("Row \(row)")
      }
    

    列表具有特殊的外观,具体取决于平台。例如,在 iOS 上,列表将显示为表格视图,并在其垂直堆叠的视图之间插入分隔线。

    您可以在List 视图中使用ForEach 视图来同时拥有动态和静态内容——SwiftUI 的一个非常强大的功能。

    示例 3:

      List {
          Text("Food")
          ForEach(meals) { meal in
              Text(meal.name)
          }
          Text("Drinks")
          ForEach(drinks) { drink in
              Text(drink.name)
          }
      }
    

【讨论】:

  • 不错的答案。一些调整: 1. 你不需要大部分 returns (SE-255, yo)。如果您只是将字符串传递给 Text(...),则无需将其包装在字符串插值中 - SwiftUI 会自动使编程字符串非本地化并本地化文字和插值。
  • 感谢您的提示。相应地更新了我的答案。看起来好多了!
  • 你能详细说明一下性能吗?哪一个更适合重复使用细胞?对于连续馈送类型的数据集,应该首选哪一个?
  • 我(遗憾地)意识到 ForEach(没有 List)无法管理插入、更新和删除动画。当然,您可以为行添加动画和过渡修饰符,但遗憾的是,当您仅更新一行时它们也会被触发(例如,当您仅更新一个索引处的文本时,这会导致插入动画)。在列表中,这也会触发为“新行”(onAppear() 被触发)但列表本身设法抑制动画......
  • “示例”在 2021 年不再有效,请更改为 ForEach(1..&lt;10) { row in
【解决方案2】:

List:

  • 混合内容(也允许使用集合)
  • 可滚动
  • 使用重用单元格模式(高效)

ForEach:

  • 仅适用于集合

List + ForEach = 超级功能。例如,在这种情况下,List 对来自ForEach 的每个视图使用重用单元格模式。您也可以使用onMoveonDelete...

【讨论】:

    【解决方案3】:

    简单解释:

    • List 的行为类似于 UIScrollView(任意长的可滚动视图 观看次数)
    • ForEach 的行为有点像 UITableView(其中每个元素都有一个单元格视图,而且它也是可滚动的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多