xcode 视图中的swift数组为空,但viewModel中包含数据

wn9m85ua  于 2022-12-19  发布在  Swift
关注(0)|答案(1)|浏览(91)

我在ViewModel文件中有一个函数,它将数据添加到数组中,我可以在我的viewModel文件中打印出这个数组,然后看到所有的数据,但是在我的视图文件中,当我调用这个数组,比如viewModel.array,它看起来里面没有数据,我该如何修改我的代码,以便我可以在视图中访问这个数组?还有fetchConvos正在init中调用()函数,因此用户数组应得到更新。
视图模型文件

class MessageViewModel: ObservableObject{
    @Published var users = [User]()
    func fetchConvos(){
        service.getConversations() { users in
            self.users = users              
        }
    }

视图

@ObservedObject var viewModel = MessageViewModel()
    var body: some View {
        if let index = viewModel.users.firstIndex(of: user) {
            ....

这里的索引从未被赋值,因为用户数组为空。

ruyhziif

ruyhziif1#

您必须订阅@Published属性 Package ,因此使用.onReceive(
为了让事情更清楚,这里有一个带注解的小例子:

class MessageViewModel: ObservableObject{
    @Published var users = [String]()
    func fetchConvos() {
        self.users = ["Name 1", "Name 2"]
    }
}
struct ContentView: View {
    @ObservedObject var viewModel = MessageViewModel()
    
    @State var name: String = ""
    
    var body: some View {
        Text(name)
            // onReceice is to subscribe to @Published property wrappers
            .onReceive(viewModel.$users, perform: { users in
                name = users.first ?? "No users!"
            })
            .onAppear { // when the view appears we creating our users in the model, thanks our onReceive subscription, we can adapt our views justs by changing the @State property wrapper
                viewModel.fetchConvos()
            }
        
        // This button changes the view itself
        Button {
            changeName()
        } label: {
            Label("Give the user a new name", systemImage: "plus")
        }
        .buttonStyle(.bordered)
        
        // onChange is for subscribing to @State property wrappers
        .onChange(of: name) { newValue in
            let newName = newValue
            print("new user name:", newName)
            viewModel.users[0] = newName // here we notify the model, that the view changed
            #warning("Make sure the users array is not empty")
        }

    }
    func changeName() {
        name = "New name"
    }
}

相关问题