V D*_*hit 2 uitextfield ios swift
我正在尝试使用五个textfield创建otp文本域.如果你添加顶部,所有工作正常,但是当用户尝试将textfield添加为空并尝试退格并且它没有调用我已经添加的UItextfiled的任何委托方法时发生问题.
我试过这个: -
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
let isBackSpace = strcmp(char, "\\b")
if (isBackSpace == -92) {
println("Backspace was pressed")
}
return true
}
Run Code Online (Sandbox Code Playgroud)
但是当textfield不为空时调用它.
例如 :-
在下面的屏幕截图中添加1和两个不同的文本字段,第三个是空的,但是当我尝试退格时,它需要进入第二个文本字段(第三个字段是空的)这是我面临的问题.
谢谢
其次是@Marmik Shah和@Prashant Tukadiya在这里回答我添加我的答案,为了快速回答我从这里采取了一些代码
步骤1 :
为您的所有文本字段创建IBOutletCollection,并且不要忘记按顺序顺序在所有文本字段中设置标记,例如[1,2,3,4,5,6]
class ViewController: UIViewController{
@IBOutlet var OTPTxtFields: [MyTextField]! // as well as set the tag for textfield in the sequence order
override func viewDidLoad() {
super.viewDidLoad()
//change button color and other options
OTPTxtFields.forEach { $0.textColor = .red; $0.backspaceTextFieldDelegate = self }
OTPTxtFields.first.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)
第2步 :
在您当前页面的UITextField委托方法中
extension ViewController : UITextFieldDelegate, MyTextFieldDelegate {
func textFieldDidEnterBackspace(_ textField: MyTextField) {
guard let index = OTPTxtFields.index(of: textField) else {
return
}
if index > 0 {
OTPTxtFields[index - 1].becomeFirstResponder()
} else {
view.endEditing(true)
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string)
if newString.count < 2 && !newString.isEmpty {
textFieldShouldReturnSingle(textField, newString : newString)
// return false
}
return newString.count < 2 || string == ""
//return true
}
override public func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(copy(_:)) || action == #selector(paste(_:)) {
return false
}
return true
}
func textFieldShouldReturnSingle(_ textField: UITextField, newString : String)
{
let nextTag: Int = textField.tag + 1
textField.text = newString
let nextResponder: UIResponder? = textField.superview?.viewWithTag(nextTag)
if let nextR = nextResponder
{
// Found next responder, so set it.
nextR.becomeFirstResponder()
}
else
{
// Not found, so remove keyboard.
textField.resignFirstResponder()
callOTPValidate()
}
}
}
Run Code Online (Sandbox Code Playgroud)
第3步:
创建用于访问后向函数的textfield类
class MyTextField: UITextField {
weak var myTextFieldDelegate: MyTextFieldDelegate?
override func deleteBackward() {
if text?.isEmpty ?? false {
myTextFieldDelegate?.textFieldDidEnterBackspace(self)
}
super.deleteBackward()
}
Run Code Online (Sandbox Code Playgroud)
}
protocol MyTextFieldDelegate: class {
func textFieldDidEnterBackspace(_ textField: MyTextField)
}
Run Code Online (Sandbox Code Playgroud)
第4步
最后按照@Marmik Shah的答案为您的UITextField定制类
第5步
从每个文本字段获取值使用此
func callOTPValidate(){
var texts: [String] = []
OTPTxtFields.forEach { texts.append($0.text!)}
sentOTPOption(currentText: texts.reduce("", +))
}
func sentOTPOption(currentText: String) {
print("AllTextfieldValue == \(currentText)")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |