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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:15:04