一、需求
前些时做了一个手机号码获取验证码的界面,需要限制输入框的输入长度是11位。还有一个需求就是在输入框输入的是11位字符的时候,获取验证码按钮可以点击且改变颜色,在输入框不是11位的时候,获取验证码按钮不可点击且又是另外一种颜色。
这个demo采用的是输入长度限制是6位,使用一个色块代表按钮。
输入框UITextField和色块是拖得控件。
二、分析问题
1.限制输入长度;
2.长度达到要求时变色。
三、解决问题
问题1:限制输入长度。
限制文本输入长度首先给textField增加一个编辑改变target。
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
然后实现
textFieldDidChange:这个事件。
#pragma mark - textFieldDidChange
- (void)textFieldDidChange:(UITextField *)textField
{
if (textField.text.length > LENGTH) {
textField.text = [textField.text substringToIndex:LENGTH - 1];// 为什么是-1 请自己实践
}
}
然后实现textFiled的这个代理方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
在这个代理方法里面我的操作:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//限制输入长度是LENGTH位
if (string.length == 0){
return YES;
}
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > LENGTH) {
return NO;
}
return YES;
}
至此问题1已经解决了。下面来看看问题2。
问题2:
长度达到要求时变色
首先分析这个问题,长度达到要求时变色。那么就是两种状态,长度没有达到和长度达到。怎么知道长度有没有达到呢?这里有两种处理方法。
第一种:
在
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
加入下面的代码
//下面代码实现 手机号码为空或未输入LENGTH位数字时的状态
if (textField.text.length < LENGTH - 1) {
self.stateView.backgroundColor = [UIColor redColor]; // 红色表示长度不是LENGTH位时的状态
}
else if(textField.text.length == LENGTH - 1){
if (range.location == LENGTH - 2) { // 点击键盘的删除按钮textField.text.length 会变为LENGTH
self.stateView.backgroundColor = [UIColor redColor]; // 红色表示长度不是LENGTH位时的状态
}
else{ // 输入的长度是LENGTH位
self.stateView.backgroundColor = [UIColor greenColor]; // 绿色表示长度是LENGTH位时的状态
}
}
else{ // 大于LENGTH位
if (range.location == LENGTH - 1) { // 点击键盘的删除按钮textField.text.length 会变为LENGTH
self.stateView.backgroundColor = [UIColor redColor]; // 红色表示长度不是LENGTH位时的状态
}
}
第二种:键值监听
首先声明一个全局的字符串接收输入的字符串。我们监听这个字符串的长度。
[self addObserver:self forKeyPath:@"inputStr" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
键值监听方法里面的处理
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"change = %@",change);
NSString *str = change[@"new"];
if (str.length == LENGTH - 1) {
self.stateView.backgroundColor = [UIColor greenColor]; // 绿色表示长度是LENGTH位时的状态
}
else{
self.stateView.backgroundColor = [UIColor redColor]; // 红色表示长度不是LENGTH位时的状态
}
}
好了两个问题都解决了。下面就是合并代码,放上下载链接了。
效果图: