【发布时间】:2021-02-17 10:12:10
【问题描述】:
class Room: ObservableObject { ... }
Contact: ObservableObject {
var chatRoom: Room
}
class Account: ObservableObject {
var rooms: Room { … }
var contacts: [Contact] {
return rooms.map {
Contact(chatRoom: $0)
}
}
func listenForRoomEvents() {
// Called on instantiation of a Room, this fires self.objectWillChange on room updates and is working properly
}
}
struct RoomView: View {
@ObservedObject var room: Room
}
/ 这是有效的 /
struct ParentView: View {
@EnvironmentObject account: Account
var body: some View {
RoomsView(account.rooms)
.onAppear {
self.account.listenForRoomEvents()
}
}
}
struct RoomsView: View {
var rooms: [Room]
var body: some View {
ForEach(rooms) { room in
NavigationLink(destination: RoomView(room: room)) {
RoomListItemView(room: room)
}
}
}
}
/ 这不起作用 /
struct ParentView: View {
@EnvironmentObject account: Account
var body: some View {
Child1(contacts: account.contacts)
.onAppear {
self.account.listenForRoomEvents()
}
}
}
struct Child1: View {
@State var selectedContact: Contact?
var contacts: [Contact]
var body: some View {
RoomView(selectedContact.chatRoom)
UserSelectorView(contacts: contacts, selectedUser: $selectedContact) // View allowing selection of a user
}
}
我在上面概述了我的设置;基本上,我使用包含所有聊天事件和其他详细信息的 Room 实例来实例化 RoomView 对象。 Child1 持有一个选定的联系人状态变量,该变量绑定到它自己的两个子视图,其中一个允许用户选择不同的联系人等。
对我来说没有意义的是 RoomView 可以很好地处理它的所有事件,但是在第二种解决方案中,例如,当新消息进入或发送后应该显示消息时,它不会更新。我正在向它传递对同一个 Room 对象的引用,但我无法像在第一个解决方案中那样让它正确更新。
当我选择一个新用户并返回到前一个用户时,消息都会按预期更新。
这是我迄今为止尝试过的:
- 将 Contact.chatRoom 设为 Published 变量,然后在 chatRoom 执行时调用 self.objectWillChange.send()
【问题讨论】: