关于限定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:@"@/:;()……#¥%&*——+~!{}|、[]‘“”’》《,。=-[email protected]#$%^&*()+{}|:><?[]\‘,;./‘\"\\`=-"];
//        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的时候,可输入一个英文字符而不能输入一个中文字符。

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

时间: 2024-11-03 02:25:50

关于限定UITextField的字长的相关文章

UITextField属性

0. enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBorderStyleBezel

UITextField小结

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)] //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBorde

关于 UITextField

UITextField属性 0.     enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITe

UITextField 全解

IOS-UITextField-全解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderSt

UITextField知多少

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBord

iOS UITextField控件总结

iOS UITextField控件总结 先声明下面总结不是自己写的. //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone

iOS之UITextfield详细解析

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBord

UITextField各种属性

//初始化textfield并设置位置及大小 UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 textField.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine,

UITextField控件属性

UITextField控件属性: enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle 设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef enum { UITextBorderStyleNone, UITextBorderStyleLine, UITextBo