#質問したいこと
現在swift4で、オリジナルアプリを作っています。そこで、ユーザーのログインが必要です。ログイン(サインアップ)はできるようになりましたが、その画面を表示するのを1回だけにしたいです。
#コード
swift4
1import UIKit 2import Firebase 3import FirebaseAuth 4 5class AccountViewController: UIViewController { 6 var acount: FirebaseApp! 7 8 @IBOutlet private weak var nameTextField: UITextField! 9 @IBOutlet private weak var emailTextField: UITextField! 10 @IBOutlet private weak var passwordTextField: UITextField! 11 12 //didTapSignUpButtonの挙動を一回にしたい。 13 @IBAction private func didTapSignUpButton() { 14 let email = emailTextField.text ?? "" 15 let password = passwordTextField.text ?? "" 16 let name = nameTextField.text ?? "" 17 18 Auth.auth().createUser(withEmail: email, password: password) { [weak self] result, error in 19 guard let self = self else { return } 20 if let user = result?.user { 21 let req = user.createProfileChangeRequest() 22 req.displayName = name 23 req.commitChanges() { [weak self] error in 24 guard let self = self else { return } 25 if error == nil { 26 user.sendEmailVerification() { [weak self] error in 27 guard let self = self else { return } 28 if error == nil { 29 // 仮登録完了画面へ遷移する処理 30 } 31 self.showErrorIfNeeded(error) 32 } 33 } 34 self.showErrorIfNeeded(error) 35 } 36 } 37 self.showErrorIfNeeded(error) 38 } 39 if (email == "" || password == "" || name == "") { 40 let message = "全てのフォームに記入して下さい。" 41 let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) 42 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 43 present(alert, animated: true, completion: nil) 44 } 45 } 46 47 private func showErrorIfNeeded(_ errorOrNil: Error?) { 48 // エラーがなければ何もしません 49 guard let error = errorOrNil else { return } 50 51 let message = "エラーが起きました" // ここは後述しますが、とりあえず固定文字列 52 let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) 53 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 54 present(alert, animated: true, completion: nil) 55 } 56 57 override func viewDidLoad() { 58 super.viewDidLoad() 59 60 // Do any additional setup after loading the view. 61 } 62 63} 64
#やってみたこと
色々なホームページを見て、作ってみましたが、うまく動きませんでした。
特にこちら↓のページを参考にさせていただきました。
https://www.mani-labo.net/entry/swift-lazy-closure
こちらにあるコードをぜひ使いたいと思っているのですが、恥ずかしながら、どこに入れればいいのか分かりません。
他に何かいいサイトだったり、実際にコードを教えていただけるのであれば、教えて下さい。よろしくお願いします。
FirebaseのAuthの処理完了後に別の画面へ遷移するようですが、
現状どのあたりに問題があるのでしょうか?
ボタンを連続でタップされたても大丈夫なようにすれば良いのでしょうか?
また、lazyはviewWillAppear()などの複数回実行されるようなライフサイクルのイベント上で一度だけ実行したい時に使った方がいいと思います。
ボタンの処理にlazyを入れてしまうと、Authの処理がエラーになった際に再度タップしても処理が走らなくなってしまう気がします。
次回アプリを開くときには、サインアップの画面を表示させないようにしたいです。
アプリを開くと毎回サインアップしなければならないのを避けたいです。
返信ありがとうございます!
なるほど、それならユーザーがサインアップ済みなのかどうかをどこかで保持しておいて
それを起動時に確認し、任意の画面に遷移させる方が適切だと思います。
Authの処理完了後に画面遷移をすると思いますが、
その際にUserDefaultsなどでサインアップ完了のフラグを保持しておいて、
AppDelegateでフラグを確認して、サインアップ後の画面を表示するようにするのが無難かなと思います。
この辺が参考になるかもしれません。
( http://blog.penginmura.tech/entry/2018/01/14/195323 )
Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
// [START_EXCLUDE]
self.hideSpinner {
if let error = error {
self.showMessagePrompt(error.localizedDescription)
return
}
self.navigationController!.popViewController(animated: true)
}
// [END_EXCLUDE]
}
こういう感じのコードを書けば良いですか?
違ったり、改良すべき点があれば教えていただけると助かります。
そうですね...
できればどんな画面の構成なっているか教えていただけないでしょうか?
例えば サインアップ画面 -> 完了画面 -> ホーム みたいな感じで、
どのように画面が遷移していくのかが知りたいです!
サインアップ画面→ホームというように画面遷移しています。
長くなりそうなので回答の方に書かせていただきます。
回答1件
あなたの回答
tips
プレビュー