关于限定UITextField的字长

这两天遇到一个需求:在UITextField中限定指定字长(这里的字长是字符串的实际长度而不是字符的个数),中英文是混合输入方式。在iOS上一般中文字符占两位英文占一位,网上找了很多代码都只是提供计算中英文字长的方法,达不到我的需求。经过一番思考做出了一个解决思路。

UITextField实现输入响应方法:

UITextFieldDelegate中没有实现类似UITextViewDelegate中 - (void)textViewDidChange: 的委托函数,这里我们有两种解决方案:

方案一:

UITextField中事实上是有注册 UITextFieldTextDidChangeNotification 的通知的,所以我们可以通过注册这一个通知函数的回调函数去实现。(但是这样我们还需要去移除监听)

[[NSNotificationCenter defaultCenter]addObserver:self 
                                        selector:@selector(textFiledEditChanged:)
                                            name:@"UITextFieldTextDidChangeNotification"
                                          object:_personNameText];
方案二:

UITextField是继承自UIControl,而UIControl.h文件中有定义到这个函数:

    - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

UIControlEventsz中就有包含一个项叫 UIControlEventEditingChanged ,所以我们据此就可以这样为UITextField注册输入改变回调:

    [_personNameText addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

获取textField中的text字符串长度

方案一:
- (NSInteger)getStringLength:(NSString*)inputStr

{
    NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSData* da = [inputStr dataUsingEncoding:enc];
    NSLog(@"-----the string length is %d------",[da length]);
    return [da length];
}
方案二:
- (NSInteger)getStringLength:(NSString*)inputStr
{
    NSInteger strlength = 0;
    char* p = (char*)[inputStr cStringUsingEncoding:NSUnicodeStringEncoding];
    for (NSInteger i=0 ; i<[inputStr lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
        if (*p) {
            p++;
            strlength++;
        }
        else {
            p++;
        }

    }
    return strlength;
}

指定字符串长截取textField输入框内字符串

先放上代码再来解释下:

- (void)setTextFieldText: (UITextField *)textField {
    NSInteger count = 0;// Chinese Character Count
    NSInteger len = textField.text.length;
    for (NSInteger i=0; i<len; i++){
        // 如果遍历到长度MaxInputLength时退出遍历
        if ([self getStringLength:[textField.text substringToIndex:i]] >= MaxInputLength) {
            break;
        }

        NSString *tmp = [textField.text substringWithRange:NSMakeRange(i, 1)];
        const char *cString = [tmp UTF8String];
        //UTF8编码中中文字符长3位
        if (strlen(cString) == 3)
        {
            count++;
        }
    }
    textField.text = [textField.text substringToIndex:(MaxInputLength - count)];
}

实现输入改变回调

这里是因为中文键盘的情况会突破字数限制导致回调函数实效,所以要先判断是否输入键盘为中文类型。
- (void)textFieldDidChange:(UITextField *)textField {
    if (textField == _personNameText) {
//        如果需要禁止输入的字符
//        NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()……#¥%&*——+~!{}|、[]‘“”’》《,。=-~!@#$%^&*()+{}|:><?[]\',;./'\"\\`=-"];
//        textField.text = [textField.text stringByTrimmingCharactersInSet:set];
        NSString *lang = [[UITextInputMode currentInputMode]primaryLanguage];
        if ([lang isEqualToString:@"zh-Hans"]) {
            UITextRange *selectedRange = [textField markedTextRange];
            UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
            //如果是输入时高亮情况则不处理
            if (!position)
                if ([self getStringLength:textField.text] > MaxInputLength) {
                    [self setTextFieldText:textField];

                }
        }else {
                if ([self getStringLength:textField.text] > MaxInputLength) {
                    [self setTextFieldText:textField];

                }
        }

总结

最后的输入在极限状态下是:比如限定10个字长,那么当中英文混合长度在9的时候,可输入一个英文字符而不能输入一个中文字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值