问题描述
我试图了解 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 (将#修改为@)