Сброс прокрутки списка SwiftUI в начало при перезагрузке с новыми данными / macOS

#macos #swiftui

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

Я попытался обернуть список в программе чтения прокрутки, но это тоже не сработало:

 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:

Возможно, вам нужно что-то вроде

     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

    }