Jam*_*ade 6 ios swift swiftui viewbuilder
在 SwiftUI 中,您可以将多个视图作为一个参数传递给另一个视图,这要归功于@ViewBuilder
. 每个子视图都是单独处理的,因此在传递后,可以包含在 等中VStack
。HStack
我的问题是:这个容器视图是否可以单独修改传递给它的每个子视图?例如,通过Spacer
在每个子视图之间添加一个。
这是我正在寻找的等效功能:
struct SomeContainerView<Content: View> {
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content()
}
let content: Content
var body: some View {
HStack {
ForEach(content.childViews, id: \.id) { child in
// Give each child view a background
// Add a Spacer in between each child view
// Conditional formatting
// Etc.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我相信这是可能的,因为标准 SwiftUI 容器视图可以影响传递给它们的子视图的外观和布局。除非这是通过 SwiftUI 的内部功能实现的?
解决这个问题的一种方法可能是传递多个视图参数而不是一个,尽管如果需要传递许多视图,这会不灵活且混乱。视图数组似乎也没有意义,因为我在 SwiftUI 中的任何地方都没有注意到这种模式。
从我个人使用 @ViewBuilder 的经验来看,这是不可能的,例如,当您将按钮和文本以及可能的 HStack 传递给 SomeContainerView 时,它会将所有这些作为单个视图(如 VStack 或任何您命名的名称)。并且任何修改都会发生在整个视图上,但是当您将 ForEach 传递给 SomeContainerView 时,情况会有所不同,在这种情况下,在发送 SomeContainerView 之前或多或少您具有相同级别的控制,并且您可以根据需要修改每一行,但是它是有限的控制,例如您无法再访问可以在 ForEach 中访问的索引或项目。让我给你更多的光线来看到事物,即使你在主体中工作,我的意思是观察和控制视图的更高级别,在主体中运行单行代码后,它不再是可编辑的,例如你有一个文本和你给了这个文本一个backgroundColor,过了一段时间你想摆脱这个颜色,所以SwiftUI在给出这个bachgroundColor之后就不再有控制权了,然后它必须重新渲染/重新构建没有backgroundColor的文本来回答你的问题顺序,这是 SwiftUI 和 UIKit-Swift 之间的巨大差异,视图就像发射后的子弹,你无法抓住它或编辑它,你必须向你想要的目标发射一颗新子弹,所以回到你的问题同样,在您将一个或某些视图发送到 SomeContainerView 后,它几乎将其视为单个视图。
但是,如果您真的非常想让您想要的事情发生,那么您应该尝试其他事情,例如 AnyView 数组可以解决您的问题,但您必须密切关注该数组的管理和控制。
归档时间: |
|
查看次数: |
1102 次 |
最近记录: |