iOS – 在 Swift 中处理 OTP(一次性代码)

SJM*_*JMC 5 keyboard one-time-password uitextfield ios swift

有没有办法通过限制其他键盘输入来处理一次性代码敲击?

我需要 OTP 文本字段来预填充短信 OTP 代码。用户不应使用键盘数字按钮手动输入 OTP。

iOS 12 我们有一次性代码选项,它将自动填充在 QuickType 栏中,用户可以点击它来填充文本字段。我找不到限制其他键盘输入的选项。

有什么方法可以让我们只允许一次性代码点击并限制从数字键盘输入任何内容。

我尝试过创建 6 个文本字段。第一个文本字段内容类型设置为一次性代码。UserInteractionEnabled 仅适用于第一个文本字段,以便用户无法在其他字段中输入数据。一旦我获得 OTP 并点击 QuickType 栏 - 一次性代码,我就会预填写所有文本字段。

查看已加载>

otp1TB.addTarget(self, action:#selector(textFieldDidChange(_:)), for: .editingChanged)


@objc func textFieldDidChange(_ textField: UITextField) {
    if let otpCode = textField.text ,  otpCode.count > 5 {
        otp1TB.text = String(otpCode[otpCode.startIndex])
        otp2TB.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 1)])
        otp3TB.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 2)])
        otp4TB.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 3)])
        otp5TB.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 4)])
        otp6TB.text = String(otpCode[otpCode.index(otpCode.startIndex, offsetBy: 5)])
        otp1TB.isUserInteractionEnabled = false 
        self.view.endEditing(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是,因为当键盘打开时第一个文本字段处于活动状态,用户可以从键盘输入数字数据。

当键盘打开时,我只需要允许一次代码点击。

bra*_*ipt 2

我认为您可以跳过这整个复杂性,只使用标准的 iOS 12 OTP 输入类型:

otpTextField.textContentType = .oneTimeCode
Run Code Online (Sandbox Code Playgroud)

请参阅:iOS 中的自动 OTP 验证?

以及涵盖它的 WWDC 2018 视频:https://developer.apple.com/videos/play/wwdc2018/204