分解@ViewBuilder TupleView

问题描述

我试图了解 Apple 如何从 viewbuilder TupleViews 中提取单个视图。特别是像 List 这样支持延迟加载视图的东西。

我已经成功地使用反射构建了一个延迟加载的 UIViewRepresentable 表视图(对 GeorgeElsham 的 ViewExtractor https://github.com/GeorgeElsham/ViewExtractor/pull/4/files 做了一些轻微修改)。但是,我仍在努力寻找一种无需反思的方法

考虑到他们对视图构建器的 10 个视图限制,这样的解决方案感觉与 Apple 可能处理它的方式很接近:

https://stackoverflow.com/a/64426470/1877760

    init<V0: View,V1: View>(
        @viewbuilder content: @escaping () -> TupleView<(V0,V1)>
    ) {
        let cv = content().value
        inputViews = [AnyView(cv.0),AnyView(cv.1)]
    }

    init<V0: View,V1: View,V2: View>(
        @viewbuilder content: @escaping () -> TupleView<(V0,V1,V2)>) {
        let cv = content().value
        inputViews = [AnyView(cv.0),AnyView(cv.1),AnyView(cv.2)]
    }

    init<V0: View,V2: View,V3: View>(
        @viewbuilder content: @escaping () -> TupleView<(V0,V2,V3)>) {
        let cv = content().value
        inputViews = [AnyView(cv.0),AnyView(cv.2),AnyView(cv.3)]
    }

...

我发现这种解决方案的问题是 ForEach 块被视为单个视图,因此它们的所有内容都放在表视图中的一行中(因此也一次加载)。我不太确定如何在不使用反射的情况下查看 TupleView 中的给定视图是否为 ForEach。

List 可以处理这样的事情,所以我猜 Apple 正在递归地向下钻取。

List {
    ForEach(0..<5) { index1 in
        ForEach(0..<2) { index2 in
            ForEach(0..<2) { index3 in
                Text("\(index1)\(index2)\(index3)")
            }
        }
    }
}

我想对目标有一个明确的定义: 给定一个内部有 0-10 个视图的 viewbuilder(其中任何一个或所有视图都可以是 ForEach 视图,其中可以嵌套),返回一个视图数组(ForEach 的内容视图展开)。

有人知道苹果是怎么做的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)