Ios 在文本字段中按Backspace/Delete
我正在尝试使用它,这样当用户在输入PIN码时按下“backspace/delete”按钮时,它就会转到并删除“previous”文本字段。我在SO上看到了其他解决方案,功能keyboardInputShouldDelete似乎很有希望,但没有起作用。非常感谢您的帮助。下面是我的代码:Ios 在文本字段中按Backspace/Delete,ios,swift,uitextfield,Ios,Swift,Uitextfield,我正在尝试使用它,这样当用户在输入PIN码时按下“backspace/delete”按钮时,它就会转到并删除“previous”文本字段。我在SO上看到了其他解决方案,功能keyboardInputShouldDelete似乎很有希望,但没有起作用。非常感谢您的帮助。下面是我的代码: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString st
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if ((textField.text?.count)! < 1) && (string.count > 0) {
if textField == txtOTP1 {
txtOTP2.becomeFirstResponder()
}
if textField == txtOTP2 {
txtOTP3.becomeFirstResponder()
}
if textField == txtOTP3 {
txtOTP4.becomeFirstResponder()
}
if textField == txtOTP4 {
check()
}
textField.text = string
userPIN = "\(self.txtOTP1.text!)\(self.txtOTP2.text!)\(self.txtOTP3.text!)\(self.txtOTP4.text!)"
return false
} else if ((textField.text?.count)! >= 1) && (string.count == 0) {
if textField == txtOTP4 {
txtOTP3.becomeFirstResponder()
}
if textField == txtOTP3 {
txtOTP2.becomeFirstResponder()
}
if textField == txtOTP2 {
txtOTP1.becomeFirstResponder()
}
if textField == txtOTP1 {
}
textField.text = ""
return false
}
else if (textField.text?.count)! >= 1 {
textField.text = string
return false
}
return true
}
func keyboardInputShouldDelete(_ textField: UITextField) -> Bool {
textField.delegate = self
return true
}
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
如果((textField.text?.count)!<1)&(string.count>0){
如果textField==txtOTP1{
txtOTP2.becomeFirstResponder()
}
如果textField==txtOTP2{
txtOTP3.成为第一响应者()
}
如果textField==txtOTP3{
txtOTP4.成为第一响应者()
}
如果textField==txtOTP4{
检查()
}
textField.text=字符串
userPIN=“\(self.txtOTP1.text!)\(self.txtOTP2.text!)\(self.txtOTP3.text!)\(self.txtOTP4.text!)”
返回错误
}如果((textField.text?.count)!>=1)和(&(string.count==0),则为else{
如果textField==txtOTP4{
txtOTP3.成为第一响应者()
}
如果textField==txtOTP3{
txtOTP2.becomeFirstResponder()
}
如果textField==txtOTP2{
txtOTP1.成为第一响应者()
}
如果textField==txtOTP1{
}
textField.text=“”
返回错误
}
如果(textField.text?.count)!>=1,则为else{
textField.text=字符串
返回错误
}
返回真值
}
func键盘输入应删除(textField:uItemField)->Bool{
textField.delegate=self
返回真值
}
试着这样做:
//Get new length of the text after input
let newLength = (textField.text ?? "").count + string.count - range.length
if newLength == 0 {
//Go back prev textfield if new length is 0
}
要克服shouldChangeCharactersIn
不会在空字段上被调用的问题,只需将用户输入的最后一个字符从最后一个文本字段带到下一个文本字段,这样用户将永远不会在第一个文本字段之外有空字段
另一种方法是在默认情况下为每个文本字段添加一个空格字符,并在其周围进行检测,但处理起来似乎更烦人。谢谢!我应该把let和if语句放在哪里?另外,我以前尝试过“携带”最后一个字符,这样它“愚弄”它,使它认为那里有一个值,但它没有按预期工作:
if textField==txtOTP1{txtOTP2.becomeFirstResponder()txtOPT2.text=txtOPT1.text}如果textField==txtOTP2{txtOTP3.becomeFirstResponder()txtOPT3.text=txtOPT2.text}
您可以将它们放在函数中的return
之前,要将其带到函数中,请检查newLength
以查看其是否与首选长度相同,然后将字符串
参数应用到下一个textField谢谢!我知道你想描述什么,但由于某种原因,它不能正常工作。它创建两个文本字段,不允许退格