我正在尝试使用它,以便当用户在输入PIN码时按下“退格/删除”按钮时,它将转到并删除“上一个”文本字段。我在SO上看到了其他解决方案,并且功能keyboardInputShouldDelete似乎很有希望,但是没有用。任何帮助是极大的赞赏。下面是我的代码:
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
}
答案 0 :(得分:0)
尝试这样做:
//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
不会在空字段上被调用的问题,只需将用户从最后一个文本字段输入的字符输入到下一个文本字段,这样用户就不会在第一个文本字段之外拥有空字段
另一种方法是在默认情况下为每个文本字段添加一个空格字符并对其进行检测,但是处理起来似乎比较烦人。