web-dev-qa-db-ja.com

複数のテキストフィールドを使用する場合にOTPを自動フェッチする方法

OTPを自動フェッチする場合(単一のテキストフィールドを使用する場合)、使用する必要があることを知っています。

otpTextField.textContentType = .oneTimeCode

ただし、複数のテキストフィールドを使用する場合(次の画像によると)

some thing like this

どうすればこれを達成できますか?

12
Bhanuteja

単一フィールドの自動OTPを取得できる場合は、そのテキストを4つのテキストフィールドに分割できます。私は信じている。

以下のように、textFieldの変更オブザーバーを使用する必要がある場合があります。

textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
func textFieldDidChange(_ textField: UITextField) {

        // here check you text field's input Type
        if textField.textContentType == UITextContentType.oneTimeCode{

            //here split the text to your four text fields

            if let otpCode = textField.text, otpCode.count > 3{

                textField.text = String(otpCode[otpCode.startIndex])
                textField1.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 1)])
                textField2.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 2)])
                textField3.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 3)])
        }
    }

}
1
Natarajan

@Natarajanの答えに似ていますが、UITextFieldDelegateメソッドを使用しています。 viewDidAppearでは、最初のテキストフィールドがファーストレスポンダーになり、タイプはoneTimeCodeになります。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {        
    // Fill your textfields here

    return true
}
0
jonaszmclaren