Rex*_*xha 8 ios swift swiftui xcode12
我有一个视图,其中显示我的消息列表。每当添加新消息时,我想滚动到底部。我正在尝试添加一个onChange事件,ForEach但这会破坏我的代码并出现一些奇怪的错误:
在“Array”上引用实例方法“onChange(of:perform:)”要求“Message”符合“Equatable”
有时
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
当我删除onChange一切都符合要求时。
这是Message模型:
struct Message: Identifiable {
var id = UUID()
var text: String
var createdAt: Date = Date()
var senderID: String
var seen: Bool
init(dictionary: [String: Any]) {
self.text = dictionary["text"] as? String ?? ""
self.senderID = dictionary["senderID"] as? String ?? ""
self.seen = dictionary["seen"] as? Bool ?? false
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
'对于每个
struct MessagesView: View {
@ObservedObject var messagesViewModel: MessagesViewModel
var body: some View {
VStack {
ScrollView(.vertical, showsIndicators: false, content: {
ScrollViewReader { reader in
VStack(spacing: 20) {
ForEach(messagesViewModel.request.messages) { message in
Text(message.text)
.id(message.id)
}
.onChange(of: messagesViewModel.request.messages) { (value) in
reader.scrollTo(value.last?.id)
}
}
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您messages是@Published以下内容应该可以工作(正如我在使用 SwiftUI 将列表滚动到底部中测试的那样)
struct MessagesView: View {
@ObservedObject var messagesViewModel: MessagesViewModel
var body: some View {
VStack {
ScrollView(.vertical, showsIndicators: false, content: {
ScrollViewReader { reader in
VStack(spacing: 20) {
ForEach(messagesViewModel.request.messages) { message in
Text(message.text)
.id(message.id)
}
.onReceive(messagesViewModel.request.$messages) { (value) in
guard !value.isEmpty else { return }
reader.scrollTo(value.last!.id)
}
}
}
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14202 次 |
| 最近记录: |