前提・実現したいこと
前提
TabBarController アプリメイン画面(ユーザ登録が終えていればいきたい先)
実現したいこと
アプリのユーザ登録をする場面で
ユーザがIDを入力した時、DB上に同じIDが入力あったときは弾いてくれて
同じIDがないときのみ登録ができるようなシステム
変数okが100のときにデータベースに書き込み、次のViewControllerまでいくようにした
該当のソースコード
swift
1import UIKit 2import Firebase 3import FirebaseFirestore 4 5class Auth2ViewController: UIViewController, UITextFieldDelegate { 6 let defaults = UserDefaults.standard 7 var db = Firestore.firestore() //インスタンスの取得 8 let user = Auth.auth().currentUser 9 var ok = 0 10 @IBOutlet weak var ID: UITextField! 11 @IBOutlet weak var Name: UITextField! 12 @IBOutlet weak var save: UIButton! 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 ID.delegate = self //delegateプロパティにselfを設定 16 Name.delegate = self //delegateプロパティにselfを設定 17 } 18 @IBAction func save(_ sender: Any) { 19 view.endEditing(true) 20 if ID.text == "" 21 { 22 let alert = UIAlertController(title: nil, message: "IDが空欄です", preferredStyle: .alert) 23 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 24 self.present(alert, animated: true, completion: nil) 25 } 26 else 27 { 28 db.collection("Users").whereField("ID", isEqualTo: ID.text!) 29 .getDocuments() { (querySnapshot, err) in 30 if let err = err {//同じ名前がなければ 31 self.ok = 100 //ここで条件が合う 32 } else { //同じ名前が見つかれば 33 for document in querySnapshot!.documents { 34 let alert = UIAlertController(title: nil, message: "このIDは使用されています", preferredStyle: .alert) 35 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 36 self.present(alert, animated: true, completion: nil) 37 } 38 } 39 } 40 } 41 if ok == 100 42 {//user!.uidでUIDの取得 43 //DBへ登録 44 self.db.collection("Users").document(self.user!.uid).setData([ 45 "ID": self.ID.text!, 46 "name": self.Name.text! 47 ]) { err in 48 if let err = err 49 { 50 print("Error writing document: (err)") 51 }//登録できれば 52 print("Document successfully written!") 53 self.defaults.set(self.Name.text, forKey: "名前") 54 let nextVC = self.storyboard?.instantiateViewController(identifier: "TabBarController") 55 //フルスクリーンにする 56 nextVC!.modalPresentationStyle = .fullScreen 57 //シーン移動する 58 self.present(nextVC!, animated: true, completion: nil) 59 } 60 61 } 62 } 63 //キーボードの設定 64 func textFieldShouldReturn(_ textField: UITextField) -> Bool 65 { 66 view.endEditing(true) //キーボードを下げる 67 return false //改行をしない 68 } 69 70 @IBAction func tapView(_ sender: UITapGestureRecognizer) 71 { 72 view.endEditing(true) 73 } 74}
試したこと
あらかじめいくつかIDを登録しDB上で管理している状態で
アプリでの入力をDB上にあるIDにするとアラートがしっかりと表示された。
またTextfieldが空欄のときにもアラートは無事に表示された
DB上にないIDを入力した際にボタンを押したところ
画面遷移はもちろん,DB上にもデータが登録されなかった。
querySnapshotらへんのコードが不安なのですが
どういったエラーなのでしょうか?
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
xcode12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。