如何在 SwiftUI 中更新变量值?
Posted
技术标签:
【中文标题】如何在 SwiftUI 中更新变量值?【英文标题】:how to update variable value in SwiftUI? 【发布时间】:2021-10-13 10:40:22 【问题描述】:似乎var username
和var password
没有随着我在文本字段中的输入而更新。由于我使用 $ 绑定,可能是什么问题
?
观点:
import SwiftUI
struct RegistrationPage: View
@ObservedObject var login : LoginViewModel
var body: some View
VStack
HStack
Text("username")
TextField( "username",
text: $login.username
)
.autocapitalization(.none)
.padding()
HStack
Text("password")
TextField( "password",
text: $login.password)
.autocapitalization(.none)
.padding()
Text("click to submit registration")
.onTapGesture
Register.insertData()
.font(.body)
.padding()
视图模型
class LoginViewModel: ObservableObject
@Published var username: String = ""
@Published var password: String = ""
下面的模型(实际上服务器数据库只收到了空白字符串,我认为这是var username
和var password
的初始值,同样的问题..)
import Foundation
import LeanCloud //the BaaS service whose SDK I used in the following
import SwiftUI
struct Register
static func insertData()
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)
【问题讨论】:
您没有显示 Minimal Reproducible Example,但您可能使用了 2 个视图模型实例,其中一个不知道另一个在做什么。每次调用 LoginViewModel() 它都是一个单独的实例 向我们展示您将LoginViewModel
传递给RegistrationPage
视图的代码。
我已经更新了我的代码,请参考更完整的版本。
【参考方案1】:
您正在insertData
内创建LoginViewModel
的新实例。因为它是一个新的实例,与您的视图中使用的实例不同,所以它不会共享任何数据。
要解决这个问题,您可以将同一实例的引用传递给函数。
struct RegistrationPage: View
@ObservedObject var login : LoginViewModel
var body: some View
TextField( "username",
text: $login.username
)
.autocapitalization(.none)
TextField( "password",
text: $login.password)
.autocapitalization(.none)
Text("click to submit registration")
.onTapGesture
Register.insertData(withViewModel: login)
.font(.body)
.padding()
struct Register
static func insertData(withViewModel login : LoginViewModel)
do
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)
【讨论】:
感激不尽!这解决了我的问题。以上是关于如何在 SwiftUI 中更新变量值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的东西来更新 laravel dotenv 文件中的变量值