Ios 如何实现用于SMS验证代码的UITextField布局/设计?
我正在尝试实现以下功能的短信验证码。我将如何实现它?在查看了Github中的大量库之后,没有一个库与此设计足够相似,而此设计在业界得到了广泛应用 我试着用六个文本字段来实现它,但发现了许多问题,因为工作量很大,除了第一个文本字段之外,其他所有文本字段都被阻止用于初始输入,Ios 如何实现用于SMS验证代码的UITextField布局/设计?,ios,iphone,swift,uitextfield,sms-verification,Ios,Iphone,Swift,Uitextfield,Sms Verification,我正在尝试实现以下功能的短信验证码。我将如何实现它?在查看了Github中的大量库之后,没有一个库与此设计足够相似,而此设计在业界得到了广泛应用 我试着用六个文本字段来实现它,但发现了许多问题,因为工作量很大,除了第一个文本字段之外,其他所有文本字段都被阻止用于初始输入,firstResponder的laggy move等等,是什么让我怀疑拥有六个文本字段是否真的是最好的方法呢 绕过边界是小菜一碟。最困难的部分是功能(即光标平稳移动、来回移动、输入错误时使所有光标都变为红色等) 你们觉得怎么样?
firstResponder
的laggy move等等,是什么让我怀疑拥有六个文本字段是否真的是最好的方法呢
绕过边界是小菜一碟。最困难的部分是功能(即光标平稳移动、来回移动、输入错误时使所有光标都变为红色等)
你们觉得怎么样?我如何实现这样的行为/功能
请尝试下面的代码。(当前包含4个UITextField
,请根据需要进行更改。)
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
//关于将值输入到textfield
if((textField.text?.characters.count)!<1&&string.characters.count>0){
让nextTag=textField.tag+1
//获取下一个响应者
var nextResponder=textField.superview?.viewWithTag(nextTag)
if(nextResponder==nil){
nextResponder=textField.superview?.viewWithTag(1)
}
textField.text=字符串;
//在第四文本字段辞职
如果textField.tag==4{
txt4.辞职FirstResponder()
}否则{
下一个响应者?成为第一响应者()
}
返回错误
}
}
试试上面的代码,我已经获取了4个UITextFields,并将其保留到最后一个textfield,您可以获取您想要的任何内容。请查看此git hub库
您还可以自定义输入文本字段的数量。首先,建议您禁用粘贴,这将处理您可能遇到的许多错误。为此,必须使用以下代码创建自定义UITextField:
import Foundation
import UIKit
class CustomUITextField: UITextField {
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
if action == "paste:" {
return false
}
return super.canPerformAction(action, withSender: sender)
}
}
其次,您的文本字段需要符合新的自定义文本字段,您可以在脚本上的属性检查器下执行此操作
在视图控制器中,需要以下代码:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (string != "") {
// Letter Clicked
if (textField.text == "") {
textField.text = string
} else {
let nextResponder: UIResponder? = textField.superview?.viewWithTag(textField.tag + 1)
if (nextResponder != nil) {
nextResponder?.becomeFirstResponder()
let nextTextfield = textField.superview?.viewWithTag(textField.tag + 1) as! UITextField
nextTextfield.text = string
}
}
return false
} else {
// Back Clicked
textField.text = string
let nextResponder: UIResponder? = textField.superview?.viewWithTag(textField.tag - 1)
if (nextResponder != nil) {
nextResponder?.becomeFirstResponder()
}
return false
}
}
你要怎么做才能让它工作
您需要依次向每个文本字段添加一个标记。例如textfield1.tag=1
和textfield2.tag=2
,等等
这个代码是做什么的
如果用户输入的字符串不等于“”,则下一个文本字段必须聚焦,此代码根据当前的textfield.tag+1
查找下一个文本字段。如果字符串不等于“”,则已单击退格,代码将查找上一个文本字段
不要忘记,对于每个文本字段,您需要将委托设置为您正在使用的viewController,如下所示:
override func viewDidLoad() {
textField1.delegate = self
textField2.delegate = self
textField3.delegate = self
textField4.delegate = self
textField5.delegate = self
textField6.delegate = self
}
您需要遵守UITextFieldDelegate
class YOUR_CLASS: UIViewController, UITextFieldDelegate {
}
尝试此操作(确保您的textField代理已连接)
您只需使用
UITextField
即可实现这一点。可能会重复此操作:-谢谢,这是我搜索了这么长时间的内容,我应该在google上搜索什么样的查询来获得这样的cocoa库?别忘了为您的textfield添加标记值。如果要从左向右,请将标记值从0添加到N-1(N=文本字段的数量),左侧的第一个文本字段的标记值应为0,右侧的最新文本字段的标记值应为N-1value@T.Jurko是的,我们需要为文本字段添加标记值。谢谢,没问题。很好的解决方案。
override func viewDidLoad() {
textField1.delegate = self
textField2.delegate = self
textField3.delegate = self
textField4.delegate = self
textField5.delegate = self
textField6.delegate = self
}
class YOUR_CLASS: UIViewController, UITextFieldDelegate {
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (string != "") {
if (textField.text == "") {
textField.text = string
let nextResponder: UIResponder? = view.viewWithTag(textField.tag + 1)
if (nextResponder != nil) {
nextResponder?.becomeFirstResponder()
}
}
return false
} else {
textField.text = string
let nextResponder: UIResponder? = view.viewWithTag(textField.tag - 1)
if (nextResponder != nil) {
nextResponder?.becomeFirstResponder()
}
return false
}
}