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>
,但 !
版本只是隐式强制展开。
基本滚动视图。当使用 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>
,但 !
版本只是隐式强制展开。