【问题标题】:SwiftUI Change View with ButtonSwiftUI 使用按钮更改视图
【发布时间】:2019-06-27 19:09:16
【问题描述】:

我知道有PresentationButtonNavigationButton 以便在最新的SwiftUI 中更改视图。但是我想做一个简单的操作,如下所示。当用户单击登录按钮时,如果凭据正确,它将登录,但也会执行 segue(在这种情况下更改视图)。但是我无法检查它们在PresentationButton 中是否正确,也无法在普通按钮中更改视图。

还有其他方法吗?

  @IBAction func signInClicked(_ sender: Any) {
        
        if emailText.text != "" && passwordText.text != "" {
            
            Auth.auth().signIn(withEmail: emailText.text!, password: passwordText.text!) { (userdata, error) in
                if error != nil {
                   //error
                } else {
                   performSegue(withIdentifier: "toFeedActivity", sender: nil)
                }
            }
        } else {
            //error
        }
    }

【问题讨论】:

  • 我认为您已经知道您发布的是UIKit 代码,而不是SwiftUI 代码。就是说,你能把SwiftUI 代码发给你吗?另外,你真的试过搜索这个网站吗?在 "[SwiftUI] login" 上快速搜索会返回两天前听起来像您的 *exact 问题的可接受答案。如果它不能解决您的问题,您可以尝试一下并更具体吗?

标签: swift swiftui xcode11


【解决方案1】:

这是一种方法。

struct AppContentView: View {
    
    @State var signInSuccess = false
    
    var body: some View {
        return Group {
            if signInSuccess {
                AppHome()
            }
            else {
                LoginFormView(signInSuccess: $signInSuccess)
            }
        }
    }
}

struct LoginFormView : View {
    
    @State private var userName: String = ""
    @State private var password: String = ""
    
    @State private var showError = false
    
    @Binding var signInSuccess: Bool
    
    var body: some View {
        VStack {
            HStack {
                Text("User name")
                TextField("type here", text: $userName)
            }.padding()
            
            HStack {
                Text(" Password")
                TextField("type here", text: $password)
                    .textContentType(.password)
            }.padding()
            
            Button(action: {
                // Your auth logic
                if(self.userName == self.password) {
                    self.signInSuccess = true
                }
                else {
                    self.showError = true
                }
                
            }) {
                Text("Sign in")
            }
            
            if showError {
                Text("Incorrect username/password").foregroundColor(Color.red)
            }
        }
    }
}

struct AppHome: View {
    
    var body: some View {
        VStack {
        Text("Hello freaky world!")
        Text("You are signed in.")
        }
    }
}

【讨论】:

  • 我想知道是否有任何方法可以使过渡动画...
  • 此解决方案不仅通过切换变量来切换内容,还可以更改整个视图。很有帮助!
  • 非常感谢,当我遇到错误“无法呈现。请提交错误”时,它帮助了我。使用 NavigationView。
【解决方案2】:

我的一个应用也有同样的需求,我找到了解决方案...

基本上你需要在 NavigationView 中插入你的主视图,然后在你的视图中添加一个不可见的 NavigationLink,创建一个 @state 变量来控制你何时想要推送视图并在你的登录回调中更改它的值...

代码如下:

struct ContentView: View {
    @State var showView = false
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    print("*** Login in progress... ***")
                    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                        self.showView = true
                    }
                }) {
                    Text("Push me and go on")
                }

                //MARK: - NAVIGATION LINKS
                NavigationLink(destination: PushedView(), isActive: $showView) {
                    EmptyView()
                }
            }
        }
    }
}


struct PushedView: View {
    var body: some View {
        Text("This is your pushed view...")
            .font(.largeTitle)
            .fontWeight(.heavy)
    }
}

【讨论】:

  • 巨大的帮助,谢谢。 NavigationView 和链接(或缺少链接)是我的问题。之前有身份验证工作,但无法在成功的身份验证时更改页面/UI。
【解决方案3】:

尝试使用 state & .sheet

struct ContentView: View {
    @State var showingDetail = false

    var body: some View {
        Button(action: {
            self.showingDetail.toggle()
        }) {
            Text("Show Detail")
        }.sheet(isPresented: $showingDetail) {
            DetailView()
        }
    }
}

【讨论】:

  • 以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
  • 这不是 OP 想要实现的。这将创建一个 Modal 而不是 UIKit 中预期的“segue”
【解决方案4】:

您可以使用带有标签的导航链接,

代码如下:

首先,声明标签变量

@State var tag : Int? = nil

然后创建你的按钮视图:

Button("Log In", action: {
                        Auth.auth().signIn(withEmail: self.email, password: self.password, completion: { (user, error) in
                            if error == nil {
                                self.tag = 1
                                print("success")
                            }else{
                                print(error!.localizedDescription)
                            }
                        })

所以当登录成功标签将变为 1 时,当标签变为 1 时,您的导航链接将被执行

导航链接代码:

NavigationLink(destination: HomeView(), tag: 1, selection: $tag) {
                EmptyView()
                }.disabled(true)

如果您使用的是表单,请使用 .disabled,因为此处的空视图将在表单上可见,并且您不希望您的用户单击它并转到 homeView。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多