Blog

Swift テキストフィールドをアラートに表示する

完成形の確認

テキストフィールドをalertに乗せる

テキストフィールド付きのアラート

OKボタン押下時に更に、送信メールが送られた旨を表示する

まずはアラートの基本形

   @IBAction func forgetPasswordTapped(_ sender: Any) {

//アラートコントローラ生成
        let alert = UIAlertController(title: "Reset Pasword", message: "Reset Password Mail will be send", preferredStyle: .alert)

//内部のOK Cancelのアクション設定
        let okAction = UIAlertAction(title: "OK", style: .default) 
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

//アラートコントローラに追加
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        
//アラート表示 
        present(alert, animated: true, completion: nil)
    }

テキストフィールドを追加する

tailingクロージャーでプレースホルダを設定

@IBAction func forgetPasswordTapped(_ sender: Any) {
        let alert = UIAlertController(title: "Reset Pasword", message: "Reset Password Mail will be 
                          send", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default) { action in

-//テキストフィールドは[UITextField]?の型で持っているので、バインディングしておく
+            guard let email = alert.textFields?.first?.text else { return }            

-//ここにOKアクション時の処理を追加予定  
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alert.addAction(okAction)
        alert.addAction(cancelAction)

-//trailing closure
+        alert.addTextField {

- //対象UITextFieldが引数として取得できる $0は最初の引数のショートハンド
+          $0.placeholder = "Email to send reset password"
+        }
        
        present(alert, animated: true, completion: nil)
    }

OK時の処理 リセットパスワードのメールを送信する

  @IBAction func forgetPasswordTapped(_ sender: Any) {
        let alert = UIAlertController(title: "Reset Pasword", message: "Reset Password Mail will be 
                          send", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: .default) { action in
            guard let email = alert.textFields?.first?.text else { return }            

-//Firebase利用しています
+            Auth.auth().sendPasswordReset(withEmail: email) { (error) in

-//エラーの場合はエラーメッセージを表示 成功時は  "Check your inbox."を表示
+                let msg = error?.localizedDescription ?? "Check your inbox."
                
-//入れ子のアラート
+                let alert = UIAlertController(title: "Reset Pasword", message: msg, preferredStyle: .alert)

-//OKアクションも同時に生成
+                alert.addAction(.init(title: "OK", style: .default, handler: nil)

-//入れ子のアラート表示
+                self.present(alert, animated: true, completion: nil)
+            }
     
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        
        alert.addTextField {
            //対象UITextFieldが引数として取得できる
            $0.placeholder = "Email to send reset password"
        }
        
        present(alert, animated: true, completion: nil)
    }

テキストフィールドをアラートに追加するときもよくあるので忘備録的な意味もあります。

ポイントは、[UITextField]?の型で保持されているということくらいかな?

$0は、クロージャーの最初の要素のショートハンドです。

こちらに説明がありますので、参考になれば幸いです。


一つ前の記事 IT人材育成方法-ITスキル編
次の記事 Swift completionHandlerについて