如何在SwiftUI中更新变量值?



似乎var usernamevar 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 usernamevar 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)
}

}



}











您正在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)
}
}
}

最新更新