我有一个简单的登录应用程序。 输入用户名和密码,然后点击登录按钮,我会得到它包含一个布尔服务器响应。 如果布尔为真,则进入下一个页面,否则显示错误消息的警报。
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
}
}
}
}
//我的登录响应是:
{ “登录”:真实的, “错误”: “”}或{ “登录”:假的, “错误”: “密码不正确”}
问题是:如果登录TRUE(在响应中),然后 - >在内容查看“$ loginVM.isLogin”变为TRUE和警报将显示。 如果登录为FALSE - > $ loginVM.isLogin为假警报,并不会显示。 我只是想相反的情况发生。 意味着我要显示警报只有在登录为FALSE。 此外,如果登录是真的,我要到下一个页面(怎么做?),否则显示在警报中的errorMessage。