【问题标题】:SwiftUI: List Refresh scrolls upSwiftUI:列表刷新向上滚动
【发布时间】:2025-12-17 12:15:02
【问题描述】:

我刚刚发现了一个有趣的行为。如果 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)

            }
        }
    }
}

【问题讨论】:

标签: swiftui xcode11 swift5


【解决方案1】:

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

【讨论】: