如何通过 SwiftUI 中的 ViewBuilder 访问 TupleView? [英] How can I access to TupleView through ViewBuilder in SwiftUI?

查看:23
本文介绍了如何通过 SwiftUI 中的 ViewBuilder 访问 TupleView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试访问我的 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 相同.让我们看看ViewBuilderbuildBlock是什么:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆