簡體   English   中英

SwiftUI ObservedObject 未在視圖中更新

[英]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 對象的引用,但在我的一生中無法像在第一個解決方案中那樣正確更新它。

當我選擇一個新用戶並返回上一個用戶時,消息都按預期更新。

這是我迄今為止嘗試過的:

  • 使 Contact.chatRoom 成為 Published 變量,然后在 chatRoom 執行時調用 self.objectWillChange.send()

好吧,我終於想通了,我不知道為什么會這樣,這可能是一個愚蠢的解決方案; 我不僅需要將 selectedContact 作為參數傳遞,還需要將房間作為另一個參數傳遞。 大綱中的代碼與我的源代碼中的代碼不完全相同,但是如果您遇到類變量未在視圖中正確更新的問題,請嘗試從鏈中的較高位置向下傳遞變量。

您運行的是哪個版本的 Xcode? 如果您運行的是 Xcode 12.2 beta2,我建議您嘗試使用 Xcode 12.0。

我在我的代碼中看到了類似的問題。 在浪費了很多時間之后,我終於發現 Xcode(我正在運行 Xcode 12.2 beta2)有一個錯誤。

SwiftUI:更新數組項不會立即更新子 UI

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM