ScrollView 中的 ScrollTo 无法按预期工作

ScrollTo in ScrollView not working as expected

基本滚动视图。当使用 scrollView.scrollTo(value,anchor:.bottom) 的值时,它会滚动。 当替换为它的值 "99" 时,它不会。不确定这是否有意。如果不是,想知道如何使用 id 的值而不是从元素的位置检索它。

struct Testchat: View {
    @State private var listMessages: [MessageTest] = []
    @State private var scrolled = false

    var body: some View {
        ScrollViewReader { scrollView in
            ScrollView {
                VStack(spacing: 0) {
                    ForEach(listMessages, id: \.id) { messageInList in
                        Text(messageInList.id)
                            .onAppear {
                                if !scrolled {
                                    let value = listMessages[99].id
                                    scrollView.scrollTo("99",anchor: .bottom)
                                    scrolled = true
                                }
                            }
                    }
                }
            }
        }
        .onAppear {
            for i in 0 ..< 100 {
                let messagetest:MessageTest = .init()
                messagetest.id = i.description
                messagetest.message = i.description
                listMessages.append(messagetest)
            }
        }
    }
}
public class MessageTest: NSObject, Codable, ObservableObject {
    var message: String!
    var id: String!

    public override init() {
        message = "VOID"
        id = "VOID"
    }
}

在您的 ForEach 中,您通过 \.id 键路径识别每一行。 MessageTest 中的 id 属性 是可选的,类型为 String! (但实际上是 String? 表示 Optional<String>)。

因此,您需要将要滚动到的行作为 String? 类型传递,而不仅仅是 String.

通过添加转换将行更改为以下内容:

scrollView.scrollTo("99" as String?, anchor: .bottom)

Link 回答关于 String?String! 如何都是 Optional<String>,但 ! 版本只是隐式强制展开。