【iOS】UITextField限制输入长度

一、需求

前些时做了一个手机号码获取验证码的界面,需要限制输入框的输入长度是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位时的状态
    }
}
好了两个问题都解决了。下面就是合并代码,放上下载链接了。 下载请点击我。

效果图:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值