【问题标题】:SwiftUI: struct View vs @ViewBuilderSwiftUI:结构视图与@ViewBuilder
【发布时间】:2020-12-28 02:50:51
【问题描述】:

如果我想在 SwiftUI 中呈现项目列表,我可以这样做(使用 XCode 12):

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(texts.indices, id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    struct MyRow: View {
        let label: String
        var body: some View {
            Text(label).font(.title3).padding()
        }
    }
}

MyRow 可以是一个函数,而不是一个结构体,这使得代码更加简洁和实用:

struct MyView: View {
    let texts: [String]
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(texts.indices, id: \.self) { index in
                    MyRow(label: texts[index])
                }
            }
        }
    }

    @ViewBuilder func MyRow(label: String) -> some View {
        Text(label).font(.title3).padding()
    }
}

我想了解这两种方法之间的区别。 是否存在您更喜欢其中一种的情况?

首先想到的是不能让@State 属性与函数一起使用,这意味着如果您的视图需要状态,则需要使用struct 方法。

就这些了吗?是否存在一种方法在优化方面更好的情况?调试?特征?便携性?

【问题讨论】:

  • 分离视图有自己的刷新周期(取决于自己的状态),但从函数返回的视图将始终在调用者主体中重建/刷新。
  • 结果是 ViewBuilder 方法似乎很棒,直到您需要具有可变状态的预览。

标签: swiftui


【解决方案1】:

@ViewBuilder 主要用于有条件地渲染视图,而不使用像 AnyView(YourView) 这样的解析器。引用Apple Developer's website:“此函数的客户端可以使用多语句闭包来提供多个子视图”。例如,如果您想根据变量显示视图,即如果某个变量为 true,则呈现 View1,如果为 false,则呈现 View2。

【讨论】:

  • 我明白,但为什么呢? @ViewBuilder 方法似乎更简洁、易读且切中要害。为什么不每次不需要@State 时都使用它?
猜你喜欢
  • 2020-06-09
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多