如何将布尔值(我从服务器获得)绑定到 SwiftUI 中的 hide/show 警报?
How to bind a Bool value(that I got from server) to hide/show an Alert in SwiftUI?
我有一个简单的登录应用程序。输入用户名和密码并单击登录按钮,我将从包含 Bool 的服务器收到响应。如果 Bool 为真,则转到下一页,否则显示带有错误消息的警报。
struct ContentView : View {
@State var username: String = ""
@State var password: String = ""
@ObjectBinding var loginVM : LoginViewModel = LoginViewModel()
var body: some View {
NavigationView {
VStack {
TextField($username, placeholder: Text("Username")
TextField($password, placeholder: Text("Password")
Button(action: {
let params : [String:String] =
["username":self.username,
"password":self.password]
self.loginVM.doLogin(params:params)
}) {
Text("Login")
}
.alert(isPresented: $loginVM.isLogin) {
Alert(title: Text("Login Error"), message:
Text(loginVM.errorMessage),
dismissButton: .default(Text("Ok")))
}
}
}
}
//LoginViewModel:
class LoginViewModel : BindableObject {
let willChange = PassthroughSubject<Void,Never>()
var isLogin : Bool = false { willSet { willChange.send() } }
var errorMessage = "" { willSet { willChange.send() } }
func doLogin(params:[String:String]) {
Webservice().login(params: params) { response in
if let myresponse = response {
if myresponse.login {
self.isLogin = true // this will fire willChange.send()
self.errorMessage = ""
} else {
self.isLogin = false
self.errorMessage = myresponse.errorMessage
}
}
}
}
//我的登录响应是:
{ "login" : true, "error": "" } 或者
{ "login" : false, "error": "Password Incorrect"}
问题是:如果登录为 TRUE(在响应中),则 -> 在 ContentView 中“$loginVM.isLogin”变为 TRUE 并且将显示警报。
如果 login 为 FALSE,则 -> $loginVM.isLogin 变为 FALSE,Alert 将不显示。我只想让 OPPOSITE 发生。意味着我只想在登录为假时显示警报。
此外,如果登录为真,我想转到下一页(该怎么做?),否则在警报中显示错误消息。
让我们看看:
您可以向名为 isError
的视图模型添加一个额外的 属性 - 并在模型中出现错误情况时使其为真:
.alert(isPresented: $loginVM.isError) { ... }
如果 loginVM.isLogin
为真或为假,则显示不同的内容更简单:
if loginVM.isLogin {
// Showing the appropriate content for a logged in user
Text("Login succesful")
} else {
// showing the login form
TextField($username, placeholder: Text("Username")
TextField($password, placeholder: Text("Password")
Button(...)
}
我有一个简单的登录应用程序。输入用户名和密码并单击登录按钮,我将从包含 Bool 的服务器收到响应。如果 Bool 为真,则转到下一页,否则显示带有错误消息的警报。
struct ContentView : View {
@State var username: String = ""
@State var password: String = ""
@ObjectBinding var loginVM : LoginViewModel = LoginViewModel()
var body: some View {
NavigationView {
VStack {
TextField($username, placeholder: Text("Username")
TextField($password, placeholder: Text("Password")
Button(action: {
let params : [String:String] =
["username":self.username,
"password":self.password]
self.loginVM.doLogin(params:params)
}) {
Text("Login")
}
.alert(isPresented: $loginVM.isLogin) {
Alert(title: Text("Login Error"), message:
Text(loginVM.errorMessage),
dismissButton: .default(Text("Ok")))
}
}
}
}
//LoginViewModel:
class LoginViewModel : BindableObject {
let willChange = PassthroughSubject<Void,Never>()
var isLogin : Bool = false { willSet { willChange.send() } }
var errorMessage = "" { willSet { willChange.send() } }
func doLogin(params:[String:String]) {
Webservice().login(params: params) { response in
if let myresponse = response {
if myresponse.login {
self.isLogin = true // this will fire willChange.send()
self.errorMessage = ""
} else {
self.isLogin = false
self.errorMessage = myresponse.errorMessage
}
}
}
}
//我的登录响应是:
{ "login" : true, "error": "" } 或者 { "login" : false, "error": "Password Incorrect"}
问题是:如果登录为 TRUE(在响应中),则 -> 在 ContentView 中“$loginVM.isLogin”变为 TRUE 并且将显示警报。 如果 login 为 FALSE,则 -> $loginVM.isLogin 变为 FALSE,Alert 将不显示。我只想让 OPPOSITE 发生。意味着我只想在登录为假时显示警报。 此外,如果登录为真,我想转到下一页(该怎么做?),否则在警报中显示错误消息。
让我们看看:
您可以向名为 isError
的视图模型添加一个额外的 属性 - 并在模型中出现错误情况时使其为真:
.alert(isPresented: $loginVM.isError) { ... }
如果 loginVM.isLogin
为真或为假,则显示不同的内容更简单:
if loginVM.isLogin {
// Showing the appropriate content for a logged in user
Text("Login succesful")
} else {
// showing the login form
TextField($username, placeholder: Text("Username")
TextField($password, placeholder: Text("Password")
Button(...)
}