首页 > 解决方案 > SwiftUI:列表刷新向上滚动

问题描述

我刚刚发现了一个有趣的行为。如果注释了 List 的.id(UUID().uuidString)修饰符,则当用户修改在初始视图中不可见的绑定控件的值时(这意味着控件可能位于列表末尾的某个位置),列表将向上滚动,因为绑定值将刷新视图。但是,如果.id(UUID().uuidString)修饰符被注释掉,列表将不会向上滚动,它将保持原样 - 这对我有好处。

我只是好奇这是否是预期的行为。当为列表提供 id 时,是否有任何东西会阻止向上滚动?


import SwiftUI

struct ScrollUpProblem: View {
    @EnvironmentObject var qList: MemoryObjectRep // MemoryObjectRep is a class keeping published parameters.
    var body: some View {
        NavigationView{
            List{
                ForEach(self.qList.QuestionList) { question in
                    ScrollUpProblemDetail(question:   self.$qList.QuestionList[self.qList.QuestionList.firstIndex(of: question)!]                                    )
                }
            }
            .id(UUID().uuidString) // <<<<<<<< ATTENTION HERE
        }
    }

}

struct ScrollUpProblemDetail: View {
    @Binding var question: SurveyQuestion

    var body: some View {
        NavigationLink(destination:QuestionCardDetail(question: $question)){
            HStack(spacing: 0){
                Text("AnyText")
                Spacer()
                Toggle(isOn: self.$question.BoolValue)
                {
                    Text("")
                }.id(UUID().uuidString)

            }
        }
    }
}

标签: swiftuixcode11swift5

解决方案


id 是视图状态的一部分。如果更改它,将重新创建视图。


推荐阅读