SwiftUI问题:Form表单输入无法更新Employee View显示
问题:Employee View无法同步ProfileFormView的表单输入更新
核心错误点
1. 两个视图使用了不同的ViewModel实例
在ContentView的TabView中,ProfileFormView通过environmentObject使用全局共享的vm,但EmployeeView却新建了一个全新的EmployeeViewModel实例,导致两个视图的数据源完全隔离,表单输入自然无法同步到EmployeeView。
2. ViewModel的userData未跟随表单字段更新
当前ViewModel仅在初始化时创建了userData数组,后续当name、empNum等@Published字段变化时,userData不会自动更新,无法将最新的表单数据同步到展示列表中。
修复方案
步骤1:统一ViewModel实例
修改ContentView中EmployeeView的初始化代码,传入全局共享的vm,而非新建实例:
struct ContentView: View { @StateObject var vm = EmployeeViewModel() var body: some View { NavigationView { ZStack { Color.gray.ignoresSafeArea() .navigationBarHidden(true) TabView { ProfileFormView() .tabItem { Image(systemName: "square.and.pencil") Text("Profile") } // 改为传入全局共享的vm EmployeeView(viewModel: vm) .tabItem { Image(systemName: "house") Text("Home") } .padding() } .environmentObject(vm) } } } }
步骤2:让userData跟随表单字段自动更新
修改EmployeeViewModel,通过Combine监听表单字段变化,实时更新userData:
import Combine @MainActor class EmployeeViewModel: ObservableObject { @Published var name = "" @Published var empNum = "" @Published var birthdate = Date(timeIntervalSince1970: 0) @Published var dept = "" @Published var userData: [Employee] = [] private var cancellables = Set<AnyCancellable>() init(name: String = "", empNum: String = "", birthdate: Date = Date(timeIntervalSince1970: 0), dept: String = "", userData: [Employee] = []) { self.name = name self.empNum = empNum self.birthdate = birthdate self.dept = dept // 初始化时创建初始数据 updateUserData() // 监听四个字段的变化,实时同步更新userData Publishers.CombineLatest4($name, $empNum, $birthdate, $dept) .sink { [weak self] name, empNum, birthdate, dept in self?.updateUserData() } .store(in: &cancellables) } // 封装更新userData的逻辑 private func updateUserData() { self.userData = [ Employee(birthdate: birthdate, name: name, empNum: empNum, department: dept) ] } }
步骤3:修复预览错误
EmployeeCardView的预览需要传入具体的Employee实例,修改预览代码:
struct EmployeeCardView_Previews: PreviewProvider { static var previews: some View { EmployeeCardView(employee: MockData.sampleUser) } }
效果验证
修改完成后,在ProfileFormView中输入数据,切换到Home标签页,EmployeeView会实时展示最新的表单数据。
内容的提问来源于stack exchange,提问作者weekendwarrior
相关产品推荐
相关产品推荐

