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

SwiftUI中TextField绑定@Published变量提交时为初始值如何解决

问题根因

你的代码存在两个核心错误导致无法拿到用户输入的内容:

  • 你在Register.insertData()静态方法内部重新创建了一个全新的LoginViewModel实例,这个实例和视图层绑定的LoginViewModel是两个完全独立的对象,新实例的username和password默认就是空字符串,自然只能提交空值到服务端。
  • @ObservedObject是SwiftUI专用的属性包装器,只能在View结构体中使用,你把它写在Model层的普通函数里没有任何作用,属于错误使用。

修复方案

第一步:修改Model层的insertData方法

调整方法接收外部传入的LoginViewModel实例,删除内部新建实例的代码:

import Foundation
import LeanCloud
import SwiftUI

struct Register {
    // 新增参数接收外部的LoginViewModel实例
    static func insertData(login: LoginViewModel) {
        do {
            // 删除原有错误的 @ObservedObject var login = LoginViewModel() 代码
            let register = LCObject(className: "Register")
            try register.set("username", value: login.username)
            try register.set("password", value: login.password)
            
            _ = register.save { result in
                switch result {
                case .success:
                    break
                case .failure(error: let error):
                    print(error)
                }
            }
        } catch {
            print(error)
        }
    }
}

第二步:修改视图层的点击提交逻辑

把视图当前持有的LoginViewModel实例传入insertData方法:

Text("点击提交注册信息")
    .onTapGesture {
        // 传入当前视图绑定的login实例
        Register.insertData(login: login)
    }

额外优化建议

  • 父视图初始化RegistrationPage传入LoginViewModel时,父层的ViewModel需要用@StateObject修饰,避免视图刷新时ViewModel被意外重建导致数据丢失。
  • 密码输入框改用SecureField替代TextField,避免明文显示密码。
  • 提交前增加非空校验,过滤用户直接提交空内容的异常场景。

内容的提问来源于stack exchange,提问作者Samul Zellyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:06:04