前提
SwiftUIとFirebaseを使って、Twitterのクローンアプリを作成しています。
その過程でユーザー情報の新規登録完了後、次のページに遷移したいのですが、うまくいきません。
ご参照いただきたいファイルは以下3つです。
1.AuthViewModel.swift → Firebaseを使用したユーザー登録のモデル情報
2.RegistrationView.swift → ユーザー新規登録Viewページの情報
3. CustomInputField.swift → RegistrationViewで使うユーザー入力フォーム
実現したいこと
- Firebaseを使ってユーザー登録を完了したタイミングで、次のページに遷移したい。
発生している問題
RegistrationView.swift のページでユーザー情報を入力後、「Sign Up」ボタンを押すと、
遷移先のページが一瞬表示されるだけで、また空白のRegistrationView.swift ページが表示されてしまいます。
↓
Firebase Consoleで確認しましたところ、ユーザーの登録情報は
Authentification、Firestore Databaseともにちゃんと登録されていました。
### ファイル1 AuthViewModel.swift
Swift
1import Firebase 2import FirebaseAuth 3import FirebaseStorage 4import FirebaseFirestore 5import FirebaseCore 6import SwiftUI 7 8class AuthViewModel: ObservableObject { 9 @Published var userSession: FirebaseAuth.User? 10 @Published var didAuthenticateUser = false 11 private var tempUserSession: FirebaseAuth.User? 12 13 init() { 14 self.userSession = Auth.auth().currentUser 15 16 print("DEBUG: User session is \(self.userSession?.uid)") 17 } 18 19 func register(withEmail email: String, password: String, fullname: String, username: String) { 20 Auth.auth().createUser(withEmail: email, password: password){ result, error in 21 if let error = error { 22 print("DEBUG: Failed to register with error \(error.localizedDescription)") 23 return 24 } 25 guard let user = result?.user else { return } 26 self.tempUserSession = user 27 28 let data = ["email": email, 29 "username": username.lowercased(), 30 "fullname": fullname, 31 "uid": user.uid] 32 33 Firestore.firestore().collection("users") 34 .document(user.uid) 35 .setData(data) { _ in 36 self.didAuthenticateUser = true 37 } 38 } 39 } 40} 41
### ファイル2 RegistrationView.swift
Swift
1 2import SwiftUI 3 4struct RegistrationView: View { 5 @State private var email = "" 6 @State private var username = "" 7 @State private var fullname = "" 8 @State private var password = "" 9 @EnvironmentObject var viewModel: AuthViewModel 10 11 var body: some View { 12 VStack{ 13 14 //以下のProfilePhotoSelectorView()は遷移したいページ先です。 15 NavigationLink(destination: ProfilePhotoSelectorView(), 16 isActive: $viewModel.didAuthenticateUser, 17 label: { }) 18 19 VStack(spacing: 40){ 20 CustomInputField(imageName: "envelope", placeholderText: "Email", text: $email) 21 CustomInputField(imageName: "person", placeholderText: "Username", text: $username) 22 CustomInputField(imageName: "person", placeholderText: "Full name", text: $fullname) 23 CustomInputField(imageName: "lock", placeholderText: "password",isSecureField: true, text: $password) 24 } 25 .padding(32) 26 27 Button { 28 viewModel.register(withEmail: email, password: password, fullname: fullname, username: username) 29 } label: { 30 Text("Sign Up") 31 } 32 Spacer() 33 } 34 } 35}
RegistrationView.swift のプレビュー画面
### ファイル3 CustomInputField.swift
Swift
1import SwiftUI 2 3struct CustomInputField: View { 4 let imageName: String 5 let placeholderText: String 6 var isSecureField: Bool? = false 7 @Binding var text: String 8 9 var body: some View { 10 VStack{ 11 HStack{ 12 Image(systemName: imageName) 13 .resizable() 14 .scaledToFit() 15 .frame(width: 20, height: 20) 16 .foregroundColor(Color(.darkGray)) 17 18 if isSecureField ?? false { 19 SecureField(placeholderText, text: $text) 20 } else { 21 TextField(placeholderText, text: $text) 22 } 23 } 24 Divider() 25 .background(Color(.darkGray)) 26 } 27 } 28} 29 30struct CustomInputField_Previews: PreviewProvider { 31 static var previews: some View { 32 CustomInputField(imageName: "envelope", placeholderText: "Email", isSecureField: false, text: .constant("")) 33 } 34}
主に試したこと
その1 NavigationLinkのNavigationStackへの書き換え
RegistrationView.swift 内の記述において、ページ遷移のためにNavigationLinkを記述しているのですが、
Xcodeのアラート表示で「'init(destination:isActive:label:)' was deprecated in iOS 16.0: use NavigationLink(value: label:) inside a NavigationStack or NavigationSplitView」と出るため、
NavigationStackを使った記述に変更しようとしたのですが、
isActiveをどう書き換えれば良いかわからず、うまくいきません。
以下参照した記事
▼iOS 16 以降で非推奨となった NavigationLink の isActive の代わりの書き方は?
https://ja.stackoverflow.com/questions/90726/ios-16-%E4%BB%A5%E9%99%8D%E3%81%A7%E9%9D%9E%E6%8E%A8%E5%A5%A8%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%9F-navigationlink-%E3%81%AE-isactive-%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AF
▼NavigationViewの不満点をNavigationStackで解決する
https://zenn.dev/chocoyama/articles/32d52cf66dd6ff
その2 import内容を変更
FIrebaseのインポート情報が足りたいのかもしれないと思い、
AuthViewModel.swiftの冒頭でたくさんimportしてみましたが、改善はありません。
以上、大変恐れ入りますが、解決策の心当たりがございましたらお教えください。
何卒よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Xcode Version 14.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。