SwiftUI中如何将View层的输入值传递给对应的ViewModel
核心问题说明
你当前代码的核心问题是 View 层的输入变量和 ViewModel 的属性完全独立,没有建立双向绑定关系,且部分必要声明缺失,所以输入值无法同步到 ViewModel。
具体修改步骤
1. 修正 EmailViewModel 代码
给需要同步的属性添加 @Published 修饰符,作为 ObservableObject 的可观察属性,支持数据变化自动同步:
import Foundation import SwiftUI class EmailViewModel: NSObject, ObservableObject { // 新增@Published修饰,支持属性变化通知 @Published var emailText = "" convenience init(emailText: String) { self.init() self.emailText = emailText } func updateDataToServer() { print("Show email text" + emailText) } }
2. 修正 EmailView 代码
删除 View 层冗余的本地邮箱状态变量,直接绑定 ViewModel 的属性,同时补全 ViewModel 的属性声明和必要的 body 结构:
import SwiftUI struct EmailView: View { // 补全ViewModel属性声明,使用@ObservedObject接收外部传入的ViewModel @ObservedObject var viewModel: EmailViewModel init(viewModel:EmailViewModel) { self.viewModel = viewModel } var body: some View { // 直接绑定ViewModel的emailText属性,输入内容自动同步到ViewModel TextField("请输入邮箱", text: $viewModel.emailText) // 发送按钮示例 Button("提交") { sendButtonAction() } } func sendButtonAction() { viewModel.updateDataToServer() } }
3. 原有跳转逻辑无需改动
你现有的 NavigationLink 跳转代码可以保持不变,初始传入空字符串即可。
修改完成后用户在输入框输入的内容会实时同步到 ViewModel 的 emailText 属性,调用 updateDataToServer 方法时就能拿到最新的输入值。
内容的提问来源于stack exchange,提问作者New iOS Dev
相关产品推荐
相关产品推荐

