【发布时间】:2021-09-22 15:35:46
【问题描述】:
基本滚动视图。当使用 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"
}
}
【问题讨论】:
-
尝试将
.id(messageInList.id)添加到您的文本中。但除此之外,与其使用String作为id,不如UUID更好。 -
感谢您的回答。这只是更复杂的事情的一个简单的例子。在我的其他情况下,ID 是 firebaseIDs (very long) 。我试图将 .id(id) 添加到视图中,它似乎确实有效。所以我非常感谢你的帮助。滚动在一种情况下工作而不是另一种情况下仍然很奇怪(但这不是第一个奇怪的行为......)
-
永远不会将类或结构中的属性声明为在
init方法中初始化的隐式解包可选。不。如果您需要选项,请使用常规选项 (?),否则使用非选项,即使没有感叹号,代码也符合要求。与 UIKit 相比,SwiftUI 更鼓励您尽可能避免使用可选项。
标签: swiftui scrollview