[英]SwiftUI ObservedObject not updating in View
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 對象的引用,但在我的一生中無法像在第一個解決方案中那樣正確更新它。
當我選擇一個新用戶並返回上一個用戶時,消息都按預期更新。
這是我迄今為止嘗試過的:
好吧,我終於想通了,我不知道為什么會這樣,這可能是一個愚蠢的解決方案; 我不僅需要將 selectedContact 作為參數傳遞,還需要將房間作為另一個參數傳遞。 大綱中的代碼與我的源代碼中的代碼不完全相同,但是如果您遇到類變量未在視圖中正確更新的問題,請嘗試從鏈中的較高位置向下傳遞變量。
您運行的是哪個版本的 Xcode? 如果您運行的是 Xcode 12.2 beta2,我建議您嘗試使用 Xcode 12.0。
我在我的代碼中看到了類似的問題。 在浪費了很多時間之后,我終於發現 Xcode(我正在運行 Xcode 12.2 beta2)有一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.