Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何实现用于SMS验证代码的UITextField布局/设计?_Ios_Iphone_Swift_Uitextfield_Sms Verification - Fatal编程技术网

Ios 如何实现用于SMS验证代码的UITextField布局/设计?

Ios 如何实现用于SMS验证代码的UITextField布局/设计?,ios,iphone,swift,uitextfield,sms-verification,Ios,Iphone,Swift,Uitextfield,Sms Verification,我正在尝试实现以下功能的短信验证码。我将如何实现它?在查看了Github中的大量库之后,没有一个库与此设计足够相似,而此设计在业界得到了广泛应用 我试着用六个文本字段来实现它,但发现了许多问题,因为工作量很大,除了第一个文本字段之外,其他所有文本字段都被阻止用于初始输入,firstResponder的laggy move等等,是什么让我怀疑拥有六个文本字段是否真的是最好的方法呢 绕过边界是小菜一碟。最困难的部分是功能(即光标平稳移动、来回移动、输入错误时使所有光标都变为红色等) 你们觉得怎么样?

我正在尝试实现以下功能的短信验证码。我将如何实现它?在查看了Github中的大量库之后,没有一个库与此设计足够相似,而此设计在业界得到了广泛应用

我试着用六个文本字段来实现它,但发现了许多问题,因为工作量很大,除了第一个文本字段之外,其他所有文本字段都被阻止用于初始输入,
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
    }
}