如何在 SwiftUI 中更新变量值?
how to update variable value in SwiftUI?
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)
}
}
}
您正在 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)
}
}
}
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)
}
}
}
您正在 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)
}
}
}