如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?

Posted

技术标签:

【中文标题】如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?【英文标题】:How to bind a Bool value(that I got from server) to hide/show an Alert in SwiftUI? 【发布时间】:2019-12-01 10:53:00 【问题描述】:

我有一个简单的登录应用程序。输入用户名和密码,然后单击登录按钮,我将收到来自服务器的响应,其中包含一个布尔值。如果 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
                 
    



//我的登录响应是:

"登录" : true, "错误": "" 或 "login" : false, "error": "密码不正确"

问题是:如果登录为 TRUE(在响应中),则 -> 在 ContentView '$loginVM.isLogin' 中变为 TRUE 并显示警报。 如果 login 为 FALSE,则 -> $loginVM.isLogin 变为 FALSE 并且不会显示警报。我只是希望相反的事情发生。意味着我只想在登录为 FALSE 时才显示警报。 另外如果登录为真,我想转到下一页(怎么做?),否则在警报中显示错误消息。

【问题讨论】:

我可以为您提供部分帮助。今天早些时候,我发布了一个关于设置模型的答案(以及相关的存储库),将其设为@EnvironmentObject 并将其传递给展示的表格。至少它应该可以帮助您在警报中检索LoginViewModel 值:***.com/questions/57148220/… 【参考方案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(...)
  

【讨论】:

所以我不需要单独的登录和主页视图,对吗?好,这很酷。所以接下来我需要将登录详细信息(即 LoginVM EnvironmentObject)存储到 UserDefaults,以便下次启动应用程序时可以获取它? 当然,如果您想在某处保留登录详细信息,当然可以选择 UserDefaults。

以上是关于如何绑定 Bool 值(我从服务器获得)以在 SwiftUI 中隐藏/显示警报?的主要内容,如果未能解决你的问题,请参考以下文章

WPF绑定复选框bool?

如何在 Swift 中获得 Bool 的相反值?

如何将 HTML 中的选择选项与两个预定义的值绑定以在 mongodb 中插入数据

将 Button 的可见性绑定到 ViewModel 中的 bool 值

如何使用javascript对属性上的数组进行分组以在特定键处获得每个组的聚合值?

如何解析像“14px”这样的字符串以在 Swift 中获取 Int 值 14 [重复]