如何订阅一个观察@Published 的函数?
how to subscribe to a function, which observes @Published?
需要在 SwiftUI 正文块中动态呈现消息列表:
var chatSpace: some View {
List(self.viewModel.getMessages(), id: \.self) { message in
message
}
}
其中视图模型,是下面的实例class:
class MessagesListViewModel: ObservableObject {
@ObservedObject var messageService: MessageService
init(messageService: MessageService) {
self.messageService = messageService
}
func getMessages() -> [MessageView] {
return self.messageService.messages.map {
return MessageView(message: [=11=])
}
}
}
我想在更新 MessageService 时反映更改 message
属性,我该如何实现?我可以以某种方式订阅更改吗?现在,我基本上是通过更新 messages
已发布的变量来添加一条消息,但是,它不会触发重新绘制
class MessageService: ObservableObject
{
@Published var messages: [Message] = [Message]()
func addMessage(_ sender: String, _ text: String, _ time: String) {
self.messages.append(Message(sender: sender, text: text, time: time))
}
}
Right now, I'm basically adding a message by updating messages published var, however, it does not trigger re-drawing
因为 @ObservedObject var messageService: MessageService
在 MessagesListViewModel
中什么都不做,因为 @ObservedObject
设计为在视图中而不是在视图模型中。
所以解决方案应该是这样的(消息的分离视图)
struct ChatSpace: some View {
@ObservedObject var messageService: MessageService // << view observes messages
var body: some View {
List(messageService.messages, id: \.self) {
MessageView(message: [=10=])
}
}
}
需要在 SwiftUI 正文块中动态呈现消息列表:
var chatSpace: some View {
List(self.viewModel.getMessages(), id: \.self) { message in
message
}
}
其中视图模型,是下面的实例class:
class MessagesListViewModel: ObservableObject {
@ObservedObject var messageService: MessageService
init(messageService: MessageService) {
self.messageService = messageService
}
func getMessages() -> [MessageView] {
return self.messageService.messages.map {
return MessageView(message: [=11=])
}
}
}
我想在更新 MessageService 时反映更改 message
属性,我该如何实现?我可以以某种方式订阅更改吗?现在,我基本上是通过更新 messages
已发布的变量来添加一条消息,但是,它不会触发重新绘制
class MessageService: ObservableObject
{
@Published var messages: [Message] = [Message]()
func addMessage(_ sender: String, _ text: String, _ time: String) {
self.messages.append(Message(sender: sender, text: text, time: time))
}
}
Right now, I'm basically adding a message by updating messages published var, however, it does not trigger re-drawing
因为 @ObservedObject var messageService: MessageService
在 MessagesListViewModel
中什么都不做,因为 @ObservedObject
设计为在视图中而不是在视图模型中。
所以解决方案应该是这样的(消息的分离视图)
struct ChatSpace: some View {
@ObservedObject var messageService: MessageService // << view observes messages
var body: some View {
List(messageService.messages, id: \.self) {
MessageView(message: [=10=])
}
}
}