yama_choki
@yama_choki (yama choki)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Swift アラート(ダイアログ)内でテキストフィールドの初期フォーカスを設定する方法

解決したいこと

Swiftで開発中のアプリにおいて、アラート?ダイアログ?を使ってユーザーIDとパスワードの入力を行うようにしており、再ログイン時には初期値にログインしていたユーザーIDが入るように実装したいです。
そのため、再ログイン時はユーザーIDが入力されている状態で、アラート表示時のテキストフィールドの初期フォーカスはパスワード入力欄にしたいと考えています。

ただ、フォーカスの変更を行えるであろうコードを加えたのですが、フォーカスが変わりませんでした。

ソースコード

下のようなコードで実装しようとしましたが、初期フォーカスはユーザーID入力欄のままでした。

@IBAction func alertBtn(_ sender: Any) {
        let alert = UIAlertController(title: "ログイン", message: "ユーザーIDとパスワードを入力してください", preferredStyle: .alert)
            
            alert.addTextField(configurationHandler: { textField in
                textField.placeholder = "ユーザーID"
            })
        
            alert.addTextField(configurationHandler: { textField in
                textField.placeholder = "パスワード"
            })
        
        // テキストフィールドが生成される順番を変え、フォーカスを変える
        // 後ほど、ユーザーIDの状態で処理を分岐する予定
            alert.textFields?[1].becomeFirstResponder()
            

            let submit = UIAlertAction(title: "送信", style: .default, handler: { (action) -> Void in
                print("Submit button tapped")
                
                if let userId = alert.textFields?[0].text {
                    print("userId: \(userId)")
                }
                if let password = alert.textFields?[1].text {
                    print("Password: \(password)")
                }
            })
            
            let cancel = UIAlertAction(title: "キャンセル", style: .cancel)
            
            alert.addAction(submit);
            alert.addAction(cancel);
            
            self.present(alert, animated: true, completion: nil)    }

自分なりに調べてみましたが、実装方法がよく分かりませんでした。
アラート内のテキストフィールドのフォーカスを変える方法があれば教えていただきたいです。
よろしくお願いいたします。

0

1Answer

presentメソッドのcompletionに実装すれば、フォーカスを移動できます。
なお、初期化でisEnabled = falseしているのは、フォーカスの移動を見えなくするためです。

@IBAction func alertBtn(_ sender: Any) {
    let alert = UIAlertController(title: "ログイン", message: "ユーザーIDとパスワードを入力してください", preferredStyle: .alert)
    
    alert.addTextField(configurationHandler: { textField in
        textField.placeholder = "ユーザーID"
        textField.isEnabled = false
        textField.tag = 1
    })
    
    alert.addTextField(configurationHandler: { textField in
        textField.placeholder = "パスワード"
        textField.isEnabled = true
        textField.tag = 2
    })
    
    let submit = UIAlertAction(title: "送信", style: .default, handler: { (action) -> Void in
        print("Submit button tapped")
        
        if let userId = alert.textFields?[0].text {
            print("userId: \(userId)")
        }
        if let password = alert.textFields?[1].text {
            print("Password: \(password)")
        }
    })
    
    let cancel = UIAlertAction(title: "キャンセル", style: .cancel)
    
    alert.addAction(submit);
    alert.addAction(cancel);
    
    self.present(alert, animated: true, completion: {
        guard let textFields = alert.textFields else { return }
        for textField in textFields {
            textField.isEnabled = true
            if textField.tag == 2 /* or 1 */ {
                textField.becomeFirstResponder()
            }
        }
    })
    
}
1Like

Comments

  1. @yama_choki

    Questioner

    ありがとうございます。フォーカスがパスワード入力欄から始まるのを確認しました。
    presentメソッドやguardがどんなモノか知らなかったので、ここから更に学習しようと思います。
    ありがとうございました。

  2. 解決なら、当Q&Aをクローズして、

    presentメソッドやguardがどんなモノか知らなかったので、ここから更に学習しようと思います。

    分からないことがあれば、新たなQ&Aを起こしてください。

  3. @yama_choki

    Questioner

    Q&Aをクローズしました。
    一旦自分で調べてみます。
    ありがとうございました。

Your answer might help someone💌