我正在开发一个聊天应用程序,需要根据消息交换的日期对消息进行分类。
View的主体如下所示。
@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)
}
从代码片段中可以清楚地看到,我有显示日期的部分,在这些部分中,我显示属于该日期的消息。
我的问题:上面的代码运行得很好,我能够很好地渲染视图,它也会滚动到最后一节。我无法实现的是,我希望滚动视图滚动到属于最后一节的结束消息。但目前它停在这个部分,它没有往下走。
我尝试过的。
我试着把这个加到";。on出现"内部forEach。
.onAppear {
scrollView.scrollTo(chatItem.msgItems[chatItem.msgItems.endIndex - 1], anchor: .bottom)
}
它没有任何作用。
我还试图强制滚动到最后一段内的最后一条消息"外层";。on出现"这没有任何作用,甚至不会滚动到最后一节,就像上面的代码一样。
如果有人帮助解决这个问题,我将不胜感激。如果我的问题不清楚,我愿意编辑或进一步解释。
scrollTo
由.id
工作,因此您必须显式地为每个视图指定标识符,例如(假设msgItem
符合此需求,否则使用逻辑的相应id(:
ForEach(chatItem.msgItems) { msgItem in
ChatView(data: msgItem).id(msgItem) // << here !!
}
有关示例和详细信息,请参阅https://stackoverflow.com/a/60855853/12299030.