0

请参见下面的示例代码:

struct TestView: View {
    var body: some View {
        ScrollViewReader { proxy in
                List {
                    ForEach(1...30, id: \.self) { item in
                        Text("\(item)")
                        .id(item)
                    }
                }
                .onAppear {
                    proxy.scrollTo(8, anchor: .topLeading)
                }
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink("test") {
                TestView()
            }
        }
    }
}

两个观察:

  1. 如果我不放入TestViewNavigationLink例如,直接放入ContentView),代码可以正常工作。

  2. 以下差异可解决此问题:

                      .onAppear {
     -                    proxy.scrollTo(8, anchor: .topLeading)
     +                    DispatchQueue.main.async() {
     +                        proxy.scrollTo(8, anchor: .topLeading)
     +                    }
                      }
    

有谁知道根本原因是什么?解决方法表明这是一个时间问题,这解释了我的观察 1,没有导航动画。那么,是不是因为在onAppear()运行时,动画仍在进行中,因此proxy.scrollTo()默默地失败了?但如果是这样,Apple 不应该提供一个onAppear()在动画完成后运行的版本吗?当前的解决方法看起来太老套了。我在网上找到了它,有不同的版本,一些 using async(),一些 using asyncAfter(),这表明没有一个是可靠的。

4

0 回答 0