【问题标题】:Does SwiftUI LazyHStack / LazyVStack still work if the ForEach loop nested?如果 ForEach 循环嵌套,SwiftUI LazyHStack / LazyVStack 是否仍然有效?
【发布时间】:2020-06-29 17:25:37
【问题描述】:

这是我的代码

LazyHStack(spacing: spacing) {
   InnerView(data: self.data) // The for loop is contained inside the InnerView
}

LazyHStack(spacing: spacing) {
   ForEach(data, id: \.self) { viewDataMap in
       buildView(viewDataMap: viewDataMap)
   }
}

“懒惰”是否适用于两个代码段?

【问题讨论】:

  • 问题出在哪里?
  • 没有问题。我在问它是否仍然是懒惰的。我很想知道它是如何工作的。根据我在这里找到的内容,我可以继续在应用程序上构建更多内容。但是一旦事情变得更加复杂,我不想遇到不可预见的问题。

标签: swift swiftui


【解决方案1】:

它可以工作,但预览在 Xcode 12.4 (12D4e) 上崩溃

报告给反馈助理

FB9121009(如果 LazyVStack 包含两个嵌套的 ForEach 其中 Data.Element : Identifiable,则预览会崩溃)

import Foundation
import SwiftUI

struct NestedForEachInLazyVStack: View {

    var items1 = (0..<3).map { _ in Item() }
    var items2 = (0..<3).map { _ in Item() }

    @ViewBuilder
    var body: some View {
        if #available(iOS 14.0, *) {
            LazyVStack {
                ForEach(items1) { _ in
                    ForEach(items2) { _ in
                        Text("text")
                    }
                }
            }
        }
    }
}

struct Item: Identifiable {
    var id = UUID()
}

struct NestedForEachInLazyVStack_Previews: PreviewProvider {
    static var previews: some View {
        NestedForEachInLazyVStack()
    }
}

【讨论】:

    【解决方案2】:

    是的,它应该可以按您的预期工作。 Lazy 属性仅在您的项目多于屏幕无法显示时才会生效。如果视图中的项目数适合您的屏幕,则使用延迟堆栈是没有意义的。

    【讨论】:

      猜你喜欢
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2015-12-14
      • 2012-05-16
      • 2013-07-09
      相关资源
      最近更新 更多