SwiftUI中的某些视图(例如VStack和HStack)支持将多个视图作为子视图,如下所示:
VStack {
Text("hello")
Text("world")
}
Run Code Online (Sandbox Code Playgroud)
从我收集,他们使用ViewBuilder使之成为可能的解释在这里。
我们如何使用@ViewBuilder创建自己的支持多个子视图的视图?例如,假设我要创建一个Layout接受任意子级的View,如下所示:
struct Layout : View {
let content: Some View
var body : some View {
VStack {
Text("This is a layout")
content()
}
}
}
Run Code Online (Sandbox Code Playgroud)
知道如何在SwiftUI中实现此模式吗?
所以我试图创建一个视图,它接受 viewBuilder 内容,循环内容的视图并在每个视图和另一个视图之间添加分隔符
struct BoxWithDividerView<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack(alignment: .center, spacing: 0) {
// here
}
.background(Color.black)
.cornerRadius(14)
}
}
Run Code Online (Sandbox Code Playgroud)
所以在我写“here”的地方,如果有意义的话,我想遍历内容的视图。我将编写一个不起作用的代码,但它解释了我想要实现的目标:
ForEach(content.subviews) { view in
view
Divider()
}
Run Code Online (Sandbox Code Playgroud)
怎么做?
我有以下代码:
struct CustomTabView: View where Content: View {
let children: [AnyView]
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
let m = Mirror(reflecting: content())
if let value = m.descendant("value") {
let tupleMirror = Mirror(reflecting: value)
let tupleElements = tupleMirror.children.map({ AnyView($0.value) }) // ERROR
self.children = tupleElements
} else {
self.children = [AnyView]()
}
}
var body: some View {
ForEach(self.children) { child in
child...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试将 转换TupleView为数组,AnyView但我收到错误
Protocol type 'Any' …Run Code Online (Sandbox Code Playgroud)