swift - 如何计算 SwiftUI 中的 @ViewBuilder 视图?
问题描述
我想知道如何inPutView
在这个代码示例中计算我的数量,代码是这样工作的,它需要一些视图并给出背景颜色并计算视图计数,感谢您的帮助。
struct ContentView: View {
var body: some View {
ModelView(inputView: {
Text("Hello, world!").padding()
Text("Hello, world!").padding()
})
}
}
struct ModelView<Content: View>: View {
var inPutView: () -> Content
init(@ViewBuilder inputView: @escaping () -> Content) { self.inPutView = inputView }
var body: some View {
VStack {
inPutView()
}
.background(Color.green)
Text("count of inPutViews: 2").padding() // Here: How can I found out the count of inPutView?
}
}
更新:
struct ContentView: View {
var inputViews: [AnyView] = [AnyView(Text("Hello, world!").padding()), AnyView(Text("Hello, world!").padding())]
var body: some View {
ModelView2(inputViews: inputViews)
}
}
struct ModelView2: View {
var inputViews: [AnyView]
var body: some View {
VStack {
ForEach(inputViews.indices, id:\.self) { index in
inputViews[index]
}
}
.background(Color.green)
Text("count of inPutViews: \(inputViews.count)")
.padding()
}
}
解决方案
@ViewBuilder
如果闭包中的单个视图,则无法检测计数。@ViewBuilder
创建一个结果视图,您将被inPutView
视为单个视图。
一种可能的解决方案是将[AnyView]
数组作为 的输入传递ModelView
。但是 thenAnyView
不符合Hashable
nor Identifiable
,所以你不能在 a 中使用它ForEach
。
在您的情况下,您可以创建一个单独的结构,符合Identifiable
:
struct AnyViewItem: Identifiable {
let id = UUID()
let view: AnyView
}
并填充ModelView
数组AnyViewItem
:
struct ModelView: View {
var inputViews: [AnyViewItem]
var body: some View {
VStack {
ForEach(inputViews) {
$0.view
}
}
.background(Color.green)
Text("count of inPutViews: \(inputViews.count)")
.padding()
}
}
然后,您可以像这样在主视图中使用它:
struct ContentView: View {
var body: some View {
ModelView(
inputViews: [
Text("Hello, world!").padding(),
Text("Hello, world!").padding(),
]
.map {
AnyViewItem(view: AnyView($0))
}
)
}
}
或者,正如评论中所建议的那样,在这种情况下,您可以创建inputViews
一个[AnyView]
数组并遍历其indices
:
ForEach(inputViews.indices, id: \.self) {
inputViews[$0]
}
推荐阅读
- c# - 如何摆脱“对象'对象'可以在方法中多次处理”
- python-3.x - 如何检查输入是否只是字符串或字符而不是特殊字符?
- python - 到熊猫的 Json 数据
- ruby-on-rails - 按字母顺序排序和限制
- sql - 对多个参数执行“SELECT TOP 5”的最简单方法是什么?
- php - 正则表达式选择除包含 5 的数字以外的任何内容
- javascript - 如何在按钮单击时获取最近隐藏输入字段的值
- linkedin-api - 将 LinkedIn 迁移到 API v2
- authentication - SPA 中使用刷新令牌和静默身份验证有什么区别?
- material-design - react-admin,折叠菜单时图标消失,只留下标签