如何在SwiftUI中将数据延迟加载到表单/列表?
我在ForEach循环中生成文本,并使用一个表单来给出一个样式,尽管它在大量数据中不起作用,但我试图在sow how中使用LazyVStack,但我没有成功!如何将数据加载到包含大量数据的表单中 PS:同样的代码在ForEach上运行良好,没有使用表单或列表,甚至在LazyVStack的帮助下使用了更重的数据。我只想让代码使用表单或列表如何在SwiftUI中将数据延迟加载到表单/列表?,swiftui,Swiftui,我在ForEach循环中生成文本,并使用一个表单来给出一个样式,尽管它在大量数据中不起作用,但我试图在sow how中使用LazyVStack,但我没有成功!如何将数据加载到包含大量数据的表单中 PS:同样的代码在ForEach上运行良好,没有使用表单或列表,甚至在LazyVStack的帮助下使用了更重的数据。我只想让代码使用表单或列表 struct ContentView: View { var body: some View { Form {
struct ContentView: View
{
var body: some View
{
Form
{
ForEach(0 ..< 1000000) { index in
Text("Row \(index)")
}
}
}
}
struct ContentView:View
{
var body:一些观点
{
类型
{
ForEach(0..<1000000){index in
文本(“行\(索引)”)
}
}
}
}
您要查找的代码如下:
struct ContentView: View {
var body: some View
{
Form
{
ForEach(0 ..< 100000, id: \.self) { index in
Text("Row \(index)")
}
}
}
}
struct ContentView:View{
var body:一些观点
{
类型
{
ForEach(0..<100000,id:\.self){中的索引
文本(“行\(索引)”)
}
}
}
}
你应该注意两件事:
首先,您应该给ForEach一个id以供使用,因为它不一定知道来自另一个项目的项目。这对于重新排序等非常重要
第二,我从你的指纹上掉了一个数量级。你要的是一张有一百万行的表格。对于渲染引擎来说,这仅仅是合理的。没有人会浏览一百万行。10万美元就可以了。同样的道理,没有人会浏览十万个项目
另一件你没有给出的是你的数据支持是什么。你的数据来自哪里?您应该限制每次显示的数据量,但这取决于源。例如,如果您使用的是核心数据,则可以限制来自存储的对象。您不应该显示超出用户可能使用的数据量。如果是,您还没有考虑到您要完成的任务。问题是,静态数据源(以及所有内部依赖项)是一次分配的,即使稍后仅在需要时才显示相应的UI行 这里有一种可能的方法来解决这个问题——使数据容器动态化并按块加载数据(考虑到列表/表单重用行) 使用Xcode 12/iOS 14进行测试
struct ContentView: View {
let max = 1000000 // even Int.max, if you want
let block = 10
@State private var indices = [0] // << initially loaded small part
var body: some View {
List {
ForEach(indices, id: \.self) { index in
Text("Row \(index)")
.onAppear {
// load next block when last row shown (or can be
// tuned to preload in avance)
if indices.last == index && index < max {
let next = max - index
indices.append(contentsOf:
Array(index + 1..<index+(next > block ? block : next)))
}
}
}
}
}
}
struct ContentView:View{
如果需要,让max=1000000//偶数Int.max
设块=10
@State private var index=[0]//谢谢,但在我的问题中,这些都无关紧要,它们不是问题。这纯粹是一个理论问题。我无法想象在表单中加载100万行是一个有效的用例(从开发人员和用户体验的角度来看)。我建议你添加一个真实世界的示例,说明你想放在那里的数据。没错,这是理论性的,显然是理论性的,但谁在乎呢?它与LazyVStack一起工作,我只是喜欢使用表单样式,给我的文本添加样式。Show advanced是你的代码!哇!甚至比LazyVStack更好!我们中的一些人对此表示否定问题!你们的代码给我留下了深刻的印象!谢谢