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
相关产品推荐
相关产品推荐

