MacOS上的SwiftUi列表过早加载每一行
我正在观察 swiftui
list
s上的奇怪问题(它们在iOS上确实可以按预期工作)。问题是 list
调用 init
& 每个行的主体
,即使这些行不在屏幕上(并且可能永远不会显示)。
如果我将 list
替换为 scrollview
+ lazyvstack
,它确实可以按预期工作(只有那些要渲染的行才能得到他们的<代码> init &amp; <代码> body 呼叫)。当然,这不是理想的解决方法,因为您将使用 list
的内置好处(主要是选择)。
我确实希望在引擎盖下, swiftui
将使用与 nstableView
(按需加载单元格)相同的机制。从历史上看,我是iOS开发人员,所以我习惯了 cellforrowatIndExpath
来自 uitableView
。
这是一个快速的要点:
import SwiftUI
@main
struct SwiftUIListVSLazyVStackApp: App {
let numbers = (0...100).map { $0 }
var body: some Scene {
WindowGroup {
/*
List calls the init & the body of *every* element on the list, even if it's not being displayed.
This is unexpected because a tableView usually only loads the visible cells as needed (cellForRowAtIndexPath)
*/
List(numbers) { number in
RowView(for: number, example: "list")
}
/*
A combination of ScrollView + LazyVStack achieves what's expected from the list. Only calls the init & body of
the element that's going to be displayed.
*/
// ScrollView {
// LazyVStack(alignment: .leading, spacing: 8) {
// ForEach(numbers) { number in
// RowView(for: number, example: "stack")
// }
// }
// }
}
}
}
struct RowView: View {
private let number: Int
private let example: String
init(for number: Int, example: String) {
print("Init \(example): \(number)")
self.number = number
self.example = example
}
var body: some View {
let _ = print("Body \(example): \(number)")
Text("\(number)")
.onAppear{ print("Appear \(example): \(number)") }
}
}
extension Int: Identifiable {
public var id: Int { self }
}
任何帮助都非常感谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论