【发布时间】:2022-01-05 21:32:06
【问题描述】:
我有一个LazyVStack,有很多行。代码:
struct ContentView: View {
var body: some View {
ScrollView {
LazyVStack {
ForEach(0 ..< 100) { i in
Text("Item: \(i + 1)")
.onAppear {
print("Appeared:", i + 1)
}
}
}
}
}
}
最初在屏幕上只能看到大约 40 行,但 onAppear 会触发 77 行。为什么会这样,为什么在屏幕上真正可见之前调用它?我不明白为什么 SwiftUI 必须“预加载”它们。
有没有办法解决这个问题,或者如果这是有意的,我怎样才能准确地知道最后一个可见项目(接受不同的行高)?
编辑
LazyVStack 的 documentation 声明:
堆栈是“惰性的”,因为堆栈视图在需要将它们呈现在屏幕上之前不会创建项目。
那么我想这一定是一个错误?
【问题讨论】:
-
如果有任何帮助,我无法使用 XCode 13.1 和 iPhone 13 Pro Max 模拟器(显示 39 行)重现它。当视图加载时,打印了 39 条记录,有点随机顺序,一旦滚动开始,额外的记录就会按顺序打印。
-
@tromgy 啊,我正在使用 Xcode 13.2.0 beta 2 :/ 这真的是一个 beta 问题吗?啊????我会在 13.1 上试一试
-
@tromgy 不-尝试复制相同的确切条件。最初仍然打印太多,不确定有什么不同。即使在真实设备上,它仍然存在相同的问题:/
-
@George:如果您将 100 更改为 1000 并且在第一次滚动后您会发现它工作得很好。
-
@swiftPunk 不,不适合我。它仍然被称为早约 39 行 - 这意味着它必须以某种方式将它认为的可见区域增加一倍
标签: swift swiftui lazyvstack