微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分解@ViewBuilder TupleView

如何解决分解@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 举报,一经查实,本站将立刻删除。