码迷,mamicode.com
首页 > 其他好文 > 详细

关于限定UITextField的字长

时间:2015-08-13 14:32:25      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:uitextfield   ios   限定字长   编码   

这两天遇到一个需求:在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的时候,可输入一个英文字符而不能输入一个中文字符。

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于限定UITextField的字长

标签:uitextfield   ios   限定字长   编码   

原文地址:http://blog.csdn.net/cnlf14/article/details/47610289

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!