繁体   English   中英

如何通过观察其他视图中的@StateObject 来初始化视图

[英]How to initialize a View by observing @StateObject from other View

我在TabView中有 2 个视图(每个视图都在不同的视图文件中):

  1. 用于添加员工 (AddEmployeeView.swift)
  2. 用于显示员工 (AllEmployeesView.swift)

我在 EmployeeDB.swift 中也有一个视图 Model。 我想使用来自 AddEmployeeView.swift 的相同 object ( @StateObject var viewModel = EmployeeViewModel() ) 来访问和显示 viewModel 的信息 AllEmployeesView.Z818056DBD7E7CD888889B.C 我尝试使用@ObservedObject这样做,这是可行的,但是当我在TabView中初始化此视图( AllEmployeesView() )时,会弹出此错误(在调用中缺少参数'viewModel'的参数)。 如何从AllEmployeesView视图访问更新的数据,例如AddEmployeeViewviewModel.allEmployees

ContentView.swift

struct ContentView: View {
    var body: some View {
        TabView() {
            AddEmployeeView()
                .tabItem {
                    Text("Add")
                }
            
            AllEmployeesView() //Missing argument for parameter 'viewModel' in call
                .tabItem {
                    Text("All Employee")
                }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

员工DB.swift

class EmployeeViewModel: ObservableObject {
    
    var allEmployees = [Employee]()
    @Published var name : String = ""
    @Published var id : String = ""
    
    struct Employee: Identifiable {
        let name : String
        let id: String
    }
    
    func save() {
        let newEmployee = Employee(name: name, id: id)
        allEmployees.append(newEmployee)
    }
    
    func getEmployees() -> [Employee] {
        return allEmployees
    }
    
}

AddEmployeeView.swift

struct AddEmployeeView: View {
    
    @StateObject var viewModel = EmployeeViewModel()
    
    var body: some View {
        VStack {
            TextField("Name", text: $viewModel.name)
            TextField("Id", text: $viewModel.id)
            Button ("Save") {
                viewModel.save()
            }
        }
        .background(.gray)
        .padding()
    }
}

struct AddEmployeeView_Previews: PreviewProvider {
    static var previews: some View {
        AddEmployeeView()
    }
}

AllEmployeesView.swift

struct AllEmployeesView: View {
    
    @ObservedObject var viewModel: EmployeeViewModel
    
    var body: some View {
    
        List {
            let allEmployees = viewModel.allEmployees
            ForEach(allEmployees) { employee in
                Text(employee.name)
            }
        }
    }
}

struct AllEmployeesView_Previews: PreviewProvider {
    static var previews: some View {
        AllEmployeesView(viewModel: EmployeeViewModel())
    }
}

您的viewModel应该有一个事实来源。 ContentView中将您的viewModel创建为@StateObject并将其传递给AddEmployeeViewAllEmployeesView

为此,请声明:

@ObservedObject var viewModel: EmployeeViewModel

AddEmployeeViewAllEmployeesView中。 然后像这样从ContentView传入viewModel

AddEmployeeView(viewModel: viewModel)

AllEmployeesView(viewModel: viewModel)

这样,您的所有三个视图都将在同一个viewModel中工作,从而使所有内容保持同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM