我有一个可以更新其内容的列表。如果在列表向下滚动屏幕后更改了内容,则更新后的列表不会重置为顶部。
import SwiftUI
struct MyData {
let a: [String]
let b: [String]
init() {
var pa = [String]()
var pb = [String]()
for i in 0...100 {
pa.append("A: (i)")
pb.append("B: (i)")
}
self.a = pa
self.b = pb
}
}
struct ListNotResetingToTop: View {
let data = MyData()
@State var showA = true
var body: some View {
VStack {
Button("Switch") { showA.toggle() }
List(showA ? data.a : data.b, id: .self) { value in
Text(value)
}
}
}
}
我试过用ScrollReader包装列表,但这也不起作用:
struct ListNotResetingToTop: View {
let data = MyData()
@State var showA = true
var body: some View {
VStack {
Button("Switch") { showA.toggle() }
ScrollViewReader { proxy in
List(showA ? data.a : data.b, id: .self) { value in
Text(value)
}.onChange(of: showA) { _ in
proxy.scrollTo(showA ? data.a.first : data.b.first)
}
}
}
}
}
您可能需要类似的东西
VStack {
Button("Switch") { showA.toggle() }
List(showA ? data.a : data.b, id: .self) { value in
Text(value)
}.id(showA) // just make id depend on modified data
}