如何在父视图中动态添加SwiftUI视图?

6

是否有可能通过动态编程方式将多个SwiftUI视图添加到父视图中?

例如,假设我们有一个基本视图,如下所示:

struct MyRectView: View {
    var body: some View {
        Rectangle()
            .fill(Color.red)
            .frame(width: 200, height: 200)
    }
}

一个定义为按钮的元素:

struct MyButtonThatMakesRects: View {

    var body: some View {
        Button(
            action: {
                // Create & add Views to parent here?
                // ...
            },
            label: {
                Text("tap to create a Rect")
            }
        )
    }
}

当点击MyButtonThatMakesRects时,是否有办法在父视图中创建多个MyRectView实例?

我的最初想法与我在UIKit中的做法相同。 即在按钮触发后,创建一个新的UIView(),然后使用.addSubview(...)将其添加到父视图中。 不确定SwiftUI是否具有类似的功能。 或者可能有一种更简单的方法来完成这个目标?

1个回答

12

SwiftUI是功能性和响应性的,所以它的输出完全反映了状态。 您将不得不存储和操作状态,以产生带有所需结果的SwiftUI视图。每当其状态更改时,该视图都会从头开始重构。 (实际上并非如此,因为底层存在一些高效的差异处理,但这是一个很好的心理模型需要使用。)

SwiftUI提供的最简单的方式是使用@State属性包装器,因此您要求的版本可能看起来像这样:

struct RootView: View {
    @State private var numberOfRects = 0

    var body: some View {
        VStack {
            Button(action: {
                self.numberOfRects += 1
            }) {
                Text("Tap to create")
            }
            ForEach(0 ..< numberOfRects, id: \.self) { _ in
                MyRectView()
            }
        }
    }
}

我猜你想要的最终结果比那更复杂,但你可以使用 @State 或使用一个指向处理你状态/模型的单独类的属性,并标记为@ObservedObject包装器,以获取你需要的任何内容。


1
这是一个好的解决方案,即使以后需要添加一些东西。 - Neo42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接