如何绑定一个布尔值(即我从服务器得到)隐藏/显示SwiftUI警报?(How to bind a B

2019-10-30 00:35发布

我有一个简单的登录应用程序。 输入用户名和密码,然后点击登录按钮,我会得到它包含一个布尔服务器响应。 如果布尔为真,则进入下一个页面,否则显示错误消息的警报。

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。

Answer 1:

让我们来看看 :

你可以额外的属性添加到您的称为视图模型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(...)
  }


文章来源: How to bind a Bool value(that I got from server) to hide/show an Alert in SwiftUI?