如何检测UITextField数字输入长度?输入8位触发函数遇Bug求助
解决UITextField输入8位数字时最后一位无法录入的问题
这个问题我之前也踩过坑!核心原因是你搞混了textField:shouldChangeCharactersInRange:replacementString:的调用时机——它是在文本实际更新到输入框之前被触发的,不是更新完成之后。
你原来的代码里,当判断self.numbercontent.text.length ==7时,此时用户输入的第8位数字还没被写入输入框,直接调用resignFirstResponder会中断系统的文本更新流程,导致这最后一位数字根本没机会被保存到输入框里。
给你两种可靠的解决方案:
方案一:在shouldChange里计算更新后的长度,延迟执行后续操作
这种方法不需要额外添加监听,直接修改原方法即可:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // 先计算文本更新后的总长度 NSUInteger updatedLength = textField.text.length + string.length - range.length; if (updatedLength == 8) { // 用0.1秒的延迟,让系统先完成文本的写入操作,再执行后续逻辑 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [textField resignFirstResponder]; [self stopFly]; }); } return YES; }
方案二:监听文本编辑变化事件(更推荐)
这种方法利用UIControlEventEditingChanged事件,在文本确实更新完成后再判断长度,逻辑更清晰,也不会有延迟的潜在问题:
- (void)viewDidLoad { [super viewDidLoad]; // 给输入框添加文本变化的监听 [self.numbercontent addTarget:self action:@selector(onTextFieldTextChanged:) forControlEvents:UIControlEventEditingChanged]; } - (void)onTextFieldTextChanged:(UITextField *)textField { if (textField.text.length == 8) { [textField resignFirstResponder]; [self stopFly]; } } // 原有的shouldChange方法只需要返回YES即可,不需要额外判断 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { return YES; }
两种方案都能解决你的问题,方案二更符合iOS的事件响应逻辑,建议优先使用。
内容的提问来源于stack exchange,提问作者yupang
相关产品推荐
相关产品推荐

