You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:00:21