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