UITextField 委托 "shouldChangeCharactersIn" 未在文本字段中首次输入时调用
UITextField Delegate "shouldChangeCharactersIn" not called for first entry in textfield
我正在构建一个接受 4 位 OTP 的视图。我的代码如下
"CodeText" 是 UITextField
的子类
class RegisterController: ModelController, UITextFieldDelegate {
@IBOutlet var firstDigit:CodeText?
@IBOutlet var secondDigit:CodeText?
@IBOutlet var thirdDigit:CodeText?
@IBOutlet var fourthDigit:CodeText?
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
self.firstDigit!.delegate = self
self.secondDigit!.delegate = self
self.thirdDigit!.delegate = self
self.fourthDigit!.delegate = self
self.firstDigit!.becomeFirstResponder()
}
// UITextField Delegate Methods
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (textField == self.firstDigit) {
if(textField.text!.characters.count >= 1 ) {
self.secondDigit?.becomeFirstResponder()
}
}
else if (textField == secondDigit) {
if(textField.text!.characters.count >= 1 ) {
self.thirdDigit?.becomeFirstResponder()
}
}
else if (textField == thirdDigit) {
if(textField.text!.characters.count >= 1 ) {
self.fourthDigit?.becomeFirstResponder()
}
}
else if (textField == fourthDigit) {
print("Fourth Digit")
if(textField.text!.characters.count >= 1 ) {
self.fourthDigit?.resignFirstResponder()
}
}
return true
}
}
除了一项功能外,以上代码对我来说工作正常。我希望在输入第四位数字后关闭键盘,但是发生的事情是 "shouldChange" 委托方法在 "fourthDigit" 获得焦点并获得它的第一个条目时未被调用,但委托在文本字段时被调用得到它的第二个条目,键盘被关闭。
因此,为了让键盘消失,需要进行不必要的击键。
任何建议都会有帮助
请尝试 string.length>0
而不是 textField.text!.characters.count >= 1
编辑
当用户使用通知
在 textfield
中输入字符时,我设法获得回调
// in your respective method where you init your text field
[_txtSearchLocation addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange :(UITextField *) textField{
}
调用此方法后,您可以调用 textField.resignFirstResponder
抱歉,对于 Obj-c,我从当前打开的文件中复制了这个,谢谢
捕获文本字段所有事件的替代选择,无需编码
- Cretae a IBAction(在您的当前文本字段中 VC)
- 在 Interface Builder 中按住 Ctrl 键并单击(或右键单击)UITextField
- 将 "Editing Changed" 事件连接到第一步中添加的文件所有者的 IBAction。
例如,您的 UIControlEventEditingChanged
方法名称是 updateContentsOfTextField
并在
中获得输出
func updateContentsOfTextField(_ theTextField: UITextField) {
print("text changed: \(theTextField.text)")
}
您可以从here
获取更多信息
我正在构建一个接受 4 位 OTP 的视图。我的代码如下
"CodeText" 是 UITextField
的子类 class RegisterController: ModelController, UITextFieldDelegate {
@IBOutlet var firstDigit:CodeText?
@IBOutlet var secondDigit:CodeText?
@IBOutlet var thirdDigit:CodeText?
@IBOutlet var fourthDigit:CodeText?
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
self.firstDigit!.delegate = self
self.secondDigit!.delegate = self
self.thirdDigit!.delegate = self
self.fourthDigit!.delegate = self
self.firstDigit!.becomeFirstResponder()
}
// UITextField Delegate Methods
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (textField == self.firstDigit) {
if(textField.text!.characters.count >= 1 ) {
self.secondDigit?.becomeFirstResponder()
}
}
else if (textField == secondDigit) {
if(textField.text!.characters.count >= 1 ) {
self.thirdDigit?.becomeFirstResponder()
}
}
else if (textField == thirdDigit) {
if(textField.text!.characters.count >= 1 ) {
self.fourthDigit?.becomeFirstResponder()
}
}
else if (textField == fourthDigit) {
print("Fourth Digit")
if(textField.text!.characters.count >= 1 ) {
self.fourthDigit?.resignFirstResponder()
}
}
return true
}
}
除了一项功能外,以上代码对我来说工作正常。我希望在输入第四位数字后关闭键盘,但是发生的事情是 "shouldChange" 委托方法在 "fourthDigit" 获得焦点并获得它的第一个条目时未被调用,但委托在文本字段时被调用得到它的第二个条目,键盘被关闭。
因此,为了让键盘消失,需要进行不必要的击键。
任何建议都会有帮助
请尝试 string.length>0
而不是 textField.text!.characters.count >= 1
编辑
当用户使用通知
在textfield
中输入字符时,我设法获得回调
// in your respective method where you init your text field
[_txtSearchLocation addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange :(UITextField *) textField{
}
调用此方法后,您可以调用 textField.resignFirstResponder
抱歉,对于 Obj-c,我从当前打开的文件中复制了这个,谢谢
捕获文本字段所有事件的替代选择,无需编码
- Cretae a IBAction(在您的当前文本字段中 VC)
- 在 Interface Builder 中按住 Ctrl 键并单击(或右键单击)UITextField
- 将 "Editing Changed" 事件连接到第一步中添加的文件所有者的 IBAction。
例如,您的 UIControlEventEditingChanged
方法名称是 updateContentsOfTextField
并在
中获得输出func updateContentsOfTextField(_ theTextField: UITextField) {
print("text changed: \(theTextField.text)")
}
您可以从here
获取更多信息