【问题标题】:SwiftUI ObservedObject not updating in ViewSwiftUI ObservedObject 未在视图中更新
【发布时间】: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()

【问题讨论】:

标签: swift swiftui combine


【解决方案1】:

好的,我终于想通了,我不知道为什么会这样,这可能是一个愚蠢的解决方案;我不仅需要将 selectedContact 作为参数传递,还需要将房间作为另一个参数传递。大纲中的代码与我的源代码中的代码并不完全相同,但是如果您遇到类变量在视图中没有正确更新的问题,请尝试将变量从链中的更高层向下传递。

【讨论】:

    【解决方案2】:

    您正在运行哪个版本的 Xcode?如果您运行的是 Xcode 12.2 beta2,我建议您尝试使用 Xcode 12.0。

    我在我的代码中看到了类似的问题。在浪费了很多时间之后,我终于发现 Xcode(我运行的是 Xcode 12.2 beta2)有一个错误。

    SwiftUI: Updating an array item does not update the child UI immediately

    【讨论】:

    • 嗯,我几周前使用的是 Beta,但我现在使用的是 12.1
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2020-10-22
    • 2020-07-12
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多