[英]SwiftUI Change View with Button
我知道有 PresentationButton 和 NavigationButton 可以在最新的 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
}
}
这是一种方法。
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 中插入你的主视图,然后在你的视图中添加一个不可见的 NavigationLink,创建一个 @state var 来控制你何时想要推送视图并在你的登录回调中更改它的值......
那是代码:
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)
}
}
尝试使用 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()
}
}
}
您可以使用带有标签的导航链接,
这是代码:
首先,声明标签var
@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)
如果您使用 Form 使用 .disabled 因为这里空视图将在表单上可见并且您不希望您的用户单击它并转到 homeView。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.