SwiftUI 中用 ScrollViewReader 实现的列表无法滚动到底部
Unable to scroll to the bottom of the list implemented with ScrollViewReader in SwiftUI
我正在开发一个聊天应用程序,我需要根据交换消息的日期对消息进行分类。
视图主体如下所示。
@ViewBuilder
private var bodyView: some View {
ScrollView(.vertical) {
ScrollViewReader { scrollView in
LazyVStack {
ForEach(chatItems, id: \.self) { chatItem in
Section(header: Label(chatItem.dateString, font: someFont))
{
ForEach(chatItem.msgItems) { msgItem in
ChatView(data: msgItem)
}
}
}
}
.onAppear {
if !chatItems.isEmpty {
scrollView.scrollTo(chatItems[chatItems.endIndex - 1],
anchor: .bottom)
}
}
}
}.background(color: someColor)
}
从代码片段可以清楚地看出我有显示日期的部分,在我显示属于该日期的消息的部分中。
我的问题: 上面的代码运行良好,我能够很好地呈现视图,并且它也滚动到最后一部分。我无法实现的是,我希望滚动视图滚动到属于最后一部分的结束消息。但目前停在路段,不往下走
我试过的。
我尝试将其添加到内部 forEach 的“.onAppear”中。
.onAppear {
scrollView.scrollTo(chatItem.msgItems[chatItem.msgItems.endIndex - 1], anchor: .bottom)
}
它什么也没做。
我还尝试强制滚动到外部“.onAppear”中最后一节内的最后一条消息,但它什么也没做,它甚至不滚动到最后一节,这通常是用上面的代码做的。
如果能帮助解决问题,我将不胜感激,如果我的问题不清楚,我愿意编辑或进一步解释。
scrollTo
由 .id
工作,所以你必须明确地为每个视图指定标识符,比如(假设 msgItem
满足这个需求,否则使用你的逻辑的相应 id ):
ForEach(chatItem.msgItems) { msgItem in
ChatView(data: msgItem).id(msgItem) // << here !!
}
查看示例和详细信息 。
我正在开发一个聊天应用程序,我需要根据交换消息的日期对消息进行分类。
视图主体如下所示。
@ViewBuilder
private var bodyView: some View {
ScrollView(.vertical) {
ScrollViewReader { scrollView in
LazyVStack {
ForEach(chatItems, id: \.self) { chatItem in
Section(header: Label(chatItem.dateString, font: someFont))
{
ForEach(chatItem.msgItems) { msgItem in
ChatView(data: msgItem)
}
}
}
}
.onAppear {
if !chatItems.isEmpty {
scrollView.scrollTo(chatItems[chatItems.endIndex - 1],
anchor: .bottom)
}
}
}
}.background(color: someColor)
}
从代码片段可以清楚地看出我有显示日期的部分,在我显示属于该日期的消息的部分中。
我的问题: 上面的代码运行良好,我能够很好地呈现视图,并且它也滚动到最后一部分。我无法实现的是,我希望滚动视图滚动到属于最后一部分的结束消息。但目前停在路段,不往下走
我试过的。
我尝试将其添加到内部 forEach 的“.onAppear”中。
.onAppear {
scrollView.scrollTo(chatItem.msgItems[chatItem.msgItems.endIndex - 1], anchor: .bottom)
}
它什么也没做。
我还尝试强制滚动到外部“.onAppear”中最后一节内的最后一条消息,但它什么也没做,它甚至不滚动到最后一节,这通常是用上面的代码做的。
如果能帮助解决问题,我将不胜感激,如果我的问题不清楚,我愿意编辑或进一步解释。
scrollTo
由 .id
工作,所以你必须明确地为每个视图指定标识符,比如(假设 msgItem
满足这个需求,否则使用你的逻辑的相应 id ):
ForEach(chatItem.msgItems) { msgItem in
ChatView(data: msgItem).id(msgItem) // << here !!
}
查看示例和详细信息