swiftui - 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)
}
}
}
}
解决方案
id 是视图状态的一部分。如果更改它,将重新创建视图。
推荐阅读
- javascript - NODE.JS 访问 EJS 模板中的函数
- postgresql - 为什么 PostgreSQL 中的 xmin 和 xmax 值相同?
- jakarta-ee - 在 JMS 队列中保留消息
- c# - 使用本地应用程序进行 Microsoft Bot SDK 测试
- pandas - Pandas:检查 to_datetime 函数中的无效值
- mysql - 如何在 Laravel 5.6 中对两列求和
- typescript - 在打字稿中从 NPM 包中扩展类
- html - 为什么这个链接变成紫色并失去了它的样式属性?
- angular - 之间的确切区别是什么?和?:角度运算符
- javascript - 我们如何在 Firestore db 中搜索 5,000 个用户?