重新加载新数据/ MacOS后,将滚动SwiftUI列表重置为顶部

时间:2020-09-21 18:28:26

标签: macos swiftui

我有一个列表,其内容可以更新。如果在向下滚动列表后更改了内容,则更新后的列表不会重置为顶部。

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)
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

可能您需要类似

    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

    }