如何通过 SwiftUI 中的 ViewBuilder 访问 TupleView? [英] How can I access to TupleView through ViewBuilder in SwiftUI?
问题描述
我正在尝试访问我的 TupleView,我的 ViewBuilder 使用它来构建内容,然后我尝试对其进行计数,在这里我编写了代码,直到这一点,我需要帮助才能找到我的 TupleView 的计数,现在不知什么原因它返回 0,我期待 5!感谢帮助.
I am trying to get access to my TupleView which my ViewBuilder use it to build the content, then I am trying to count it, here I made my codes until this point, I need help to find the count of my TupleView, right now for unknown reason it returns 0, which I was expecting 5! thanks for help.
import SwiftUI
struct ContentView: View {
var body: some View {
ModelView(content: {
Text("Hello, world! 1")
.padding()
Text("Hello, world! 2")
.padding()
Text("Hello, world! 3")
.padding()
Text("Hello, world! 4")
.padding()
Text("Hello, world! 5")
.padding()
})
}
}
struct ModelView<Content: View>: View {
var content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
let size = Mirror(reflecting: content).children.count // <<: Here! it returns 0! which must be 5!
print(size)
}
var body: some View {
content()
}
}
推荐答案
如何在 SwiftUI 中通过 ViewBuilder 访问 TupleView?
How can I access to TupleView through ViewBuilder in SwiftUI?
明确地与 SwiftUI 相同.让我们看看ViewBuilder
的buildBlock
是什么:
Explicitly to the same way as SwiftUI does. Let's see what is buildBlock
of the ViewBuilder
:
这意味着 ViewBuilder
对于从 1 到 10 的每个内容视图计数都有显式函数.如
That means that ViewBuilder
has explicit function for every count of content views from 1 to 10. Like
extension ViewBuilder {
public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
}
因此,如果您想访问视图构建器元组视图,则需要执行相同的操作,例如(使用 Xcode 12.4 测试)
So if you want to access view builder tuple views, you need to do the same, like (tested with Xcode 12.4)
struct ModelContentView: View {
var body: some View {
ModelView(content: {
Text("Hello, world! 1")
.padding()
Text("Hello, world! 2")
.padding()
// Text("Hello, world! 3")
// .padding()
// Text("Hello, world! 4")
// .padding()
// Text("Hello, world! 5")
// .padding()
})
}
}
struct ModelView<Content: View>: View {
var count: Int
var content: () -> Content
private init(count: Int = 1, @ViewBuilder content: @escaping () -> Content) {
self.content = content
self.count = count
}
var body: some View {
content()
}
}
extension ModelView {
init<V1: View, V2: View>(@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(V1, V2)> {
self.init(count: 2, content: content)
}
init<V1: View, V2: View, V3: View>(@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(V1, V2, V3)> {
self.init(count: 3, content: content)
}
// ... all other variants
}
这篇关于如何通过 SwiftUI 中的 ViewBuilder 访问 TupleView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!