最新の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
}
}
ここに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.")
}
}
}
私のアプリの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)
}
}
タグ付きのナビゲーションリンクを使用できるので、
これがコードです:
まず、タグ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()
}
}
}