0

我创建了一个带有 init() 的 ViewModel,它接受类似这样的参数。PS:学习swift和swiftUI

//UsersViewModel.swift
class UsersViewModel: ObservableObject {
  @Published var users: [User]
  @Published var category: String
  init(category: String) {
    self.category = continentcategory
    self.users = UserData().getUsers(byCategory: category)
  }
}  

UserData 是我有一个函数 getUsers(byCategory) 的数据模型,它允许我获取数据子集而不是所有数据,然后对其进行过滤。

对于我的 SwiftUI 视图

//UserListByCategory.swift

import SwiftUI
struct UserListByCategory: View {
    @EnvironmentObject var ud: UsersViewModel
    var body: some View {
        Text("Hello")
    }
}

struct UserListByCategory_Previews: PreviewProvider {
    static var previews: some View {
        UserListByCategory()
            .environmentObject(UsersViewModel(category: "Office"))
    }
}

在用户选择一个类别后,上面的 SwiftUI View 会被另一个 ListView 调用。如何在不在这里硬编码的情况下通过该类别?

4

1 回答 1

0

在 SwiftUI 中,我们不为视图数据使用视图模型对象。视图结构是我们的主要封装机制,例如

如果您需要获取数据:

struct UserListByCategory: View {

    let category: String
    @State var users: [User] = []

    var body: some View {
        List {
            ForEach(users) { user in
                Text("\(user.name)")
            }
        }
        .task(id: category) {
            users = await fetchUsers(category: category)
        }
    }
}

struct UserListByCategory_Previews: PreviewProvider {
    static var previews: some View {
        UserListByCategory(category: "Office")
    }
}

如果您已经拥有所有模型数据,请将其传递到 View 结构层次结构中,如下所示:

struct ContentView: View {
    @ObservedObject var model: Model
    var body: some View {
        UserList(users: model.users(category:"Office"))
    }
}

struct UserList: View {
    let users: [User]

    var body: some View {
        List {
            ForEach(users) { user in
                Text("\(user.name)")
            }
        }
    }
}
于 2022-01-10T20:48:51.923 回答