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 !!
}

查看示例和详细信息