UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用
Posted
技术标签:
【中文标题】UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用【英文标题】:UITextField Delegate "shouldChangeCharactersIn" not called for first entry in textfield 【发布时间】:2017-04-01 12:55:24 【问题描述】:我正在构建一个接受 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
上面的代码对我来说很好,除了一个功能。我希望在输入第四位数字后关闭键盘,但是发生的情况是当“fourthDigit”获得焦点并获得它的第一个条目时不调用“shouldChange”委托方法,但是当文本字段获得它的第二个条目时调用委托并且键盘被关闭了。
因此,为了消除键盘,需要进行不必要的击键。
任何建议都会有所帮助
【问题讨论】:
为什么不尝试使用Editing Changed
而不是shouldChangeCharactersIn
【参考方案1】:
捕获文本字段的所有事件的替代选择,无需编码
创建一个 IBAction(在您的当前文本字段 VC 中) 在 Interface Builder 中的 UITextField 上按住 Ctrl 并单击(或右键单击) 将“Editing Changed”事件连接到第一步添加的文件所有者的 IBAction。例如,您的 UIControlEventEditingChanged
方法名称是 updateContentsOfTextField
并在
中获取输出func updateContentsOfTextField(_ theTextField: UITextField)
print("text changed: \(theTextField.text)")
您可以从here获取更多信息
【讨论】:
【参考方案2】:请尝试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,我从当前打开的文件中复制了这个 thx
【讨论】:
问题是方法本身没有被调用。在这种情况下,改变条件将无济于事。感谢您的回复 我猜你不会错过你最后一个textfield
的设置委托
在文本字段中输入第二个条目时,已设置委托并调用方法以上是关于UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用的主要内容,如果未能解决你的问题,请参考以下文章