在OTP中,使用了四个文本字段。按住键盘后退按钮的同时将光标移动到上一个文本字段?
答案 0 :(得分:2)
要检测UITextField中的退格事件,首先需要为UITextField设置委托并将其设置为self。
class ViewController: UIViewController,UITextFieldDelegate
self.textField.delegate = self
然后使用下面的委托方法检测是否按下了退格键
func textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replacementString string:String) - >布尔{
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let char = string.cString(using: String.Encoding.utf8)
let isBackSpace: Int = Int(strcmp(char, "\u{8}"))
if isBackSpace == -8 {
print("Backspace was pressed")
}
return true
}
基本上,此方法会检测您按下的按钮(或刚刚按下的按钮)。此输入作为NSString输入。我们将此NSString转换为C char类型,然后将其与传统的退格符(\ u {8})进行比较。然后,如果此strcmp等于-8,我们可以将其检测为退格。
选择2
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (string.characters.count ) == 0 {
//Delete any cases
if range.length > 1 {
//Delete whole word
}
else if range.length == 1 {
//Delete single letter
}
else if range.length == 0 {
//Tap delete key when textField empty
}
}
return true
}
答案 1 :(得分:2)
创建UITextField
的子类。然后覆盖deleteBackward
方法。最后,通过确认delegate
协议,使自定义BackSpaceDelegate
检测目标类中的退格。这里给你一个演示:
protocol BackSpaceDelegate {
func deleteBackWord(textField: CustomTextField)
}
class CustomTextField: UITextField {
var backSpaceDelegate: BackSpaceDelegate?
override func deleteBackward() {
super.deleteBackward()
// called when textfield is empty. you can customize yourself.
if text?.isEmpty ?? false {
backSpaceDelegate?.deleteBackWord(textField: self)
}
}
}
class YourViewController: UIViewController, BackSpaceDelegate {
func deleteBackWord(textField: CustomTextField) {
/// do your stuff here. That means resign or become first responder your expected textfield.
}
}
希望这会对你有所帮助。
答案 2 :(得分:0)
检查textFieldShouldChangeTextInRange中的'string'参数(你得到了名字,不是吗?)。如果它为空,则点击“退格”按钮。
如果'string'参数和文本字段的'text'属性都为空,则可以移动到上一个文本字段。