web-dev-qa-db-ja.com

SwiftUIボタンでビューを変更

最新のSwiftUIでビューを変更するためのPresentationButtonとNavigationButtonがあることを理解しています。ただし、以下のような簡単な操作をしたい。資格情報が正しい場合にユーザーが[サインイン]ボタンをクリックすると、ユーザーはサインインしますが、セグエも実行します(この場合はビューを変更します)。しかし、それらが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
        }




    }
2
Atils

ここに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($userName, placeholder: Text("type here"))
            }.padding()

            HStack {
                Text(" Password")
                TextField($password, placeholder: Text("type here"))
                    .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.")
        }
    }
}

10
SMP

私のアプリの1つでも同じニーズがあり、解決策を見つけました...

基本的に、メインビューを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)
    }
}
2
DungeonDev

タグ付きのナビゲーションリンクを使用できるので、

これがコードです:

まず、タグ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)

ここでは空のビューがフォームに表示され、ユーザーがそれをクリックしてhomeViewに移動しないようにするため、Form use .disabledを使用している場合。

状態と.sheetで試す

struct ContentView: View {
    @State var showingDetail = false

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