![](/img/trans.png)
[英]SwiftUI: How to initialize a new StateObject in a parent view?
[英]How to initialize a View by observing @StateObject from other View
我在TabView
中有 2 个视图(每个视图都在不同的视图文件中):
我在 EmployeeDB.swift 中也有一个视图 Model。 我想使用来自 AddEmployeeView.swift 的相同 object ( @StateObject var viewModel = EmployeeViewModel()
) 来访问和显示 viewModel 的信息 AllEmployeesView.Z818056DBD7E7CD888889B.C 我尝试使用@ObservedObject
这样做,这是可行的,但是当我在TabView
中初始化此视图( AllEmployeesView()
)时,会弹出此错误(在调用中缺少参数'viewModel'的参数)。 如何从AllEmployeesView
视图访问更新的数据,例如AddEmployeeView
的viewModel.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
并将其传递给AddEmployeeView
和AllEmployeesView
。
为此,请声明:
@ObservedObject var viewModel: EmployeeViewModel
在AddEmployeeView
和AllEmployeesView
中。 然后像这样从ContentView
传入viewModel
:
AddEmployeeView(viewModel: viewModel)
和
AllEmployeesView(viewModel: viewModel)
这样,您的所有三个视图都将在同一个viewModel
中工作,从而使所有内容保持同步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.