首页 > 解决方案 > 重新加载新数据/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)
                }
            }
        }
    }
}

标签: macosswiftui

解决方案


可能你需要类似的东西

    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

    }

推荐阅读