彻底解决textField长度限制的问题,包括中英文

UITextField *setName = [[UITextField alloc] initWithFrame:CGRectMake(20, bgView.bottom + 39, kScreenWidth - 40, 60)];

    setName.borderStyle = UITextBorderStyleRoundedRect;

    setName.returnKeyType = UIReturnKeyDone;

    setName.font = kFont(16);

    setName.delegate = self;

    setName.placeholder = @"设置名称,10个字符内";

    setName.autocorrectionType = UITextAutocorrectionTypeNo;

    setName.clearButtonMode = UITextFieldViewModeUnlessEditing;

    [self addSubview:setName];

//在这里用通知或者添加事件都是一样的,每当textfield的字符改变后都会触发这个事件

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

//    [kNotificationCenter addObserver:self selector:@selector(textFieldDidChangeNotification:) name:UITextFieldTextDidBeginEditingNotification object:nil];

 

- (void)textFieldDidChangeNotification:(NSNotification *)notification{

    NSLog(@"%@",notification.object);

 }

 

- (void)textFieldDidChange:(UITextField *)textField

{

    NSString *currentStr = textField.text;

    //输入法的模式:中文还是英文输入

    NSString *inputModel = [[textField textInputMode] primaryLanguage];

    //currentRange.start 为当前光标所在的位置,end为输入后累加的位置

    UITextRange *currentRange = [textField markedTextRange];

    

    //selectoRange.start 为上次输入结束光标的位置(上次输的字符串总长度), end还不知道代表什么

    UITextRange *selectoRange =[textField selectedTextRange];

    

    //正在输入,是否选择了具体字符,选择了具体字符textPosition为空,反之不为空,offset光标位置的偏移量

    UITextPosition *position = [textField positionFromPosition:currentRange.start offset:0];

    

    if ([inputModel isEqualToString:@"zh-Hans"]) {

        if (position == nil) {//解决用户使用词语联想的时候,textfield的代理是检测不到的,所以需要在这里处理

            if (currentStr.length > 10) {

                textField.text = [textField.text substringToIndex:10];

            }

        }

    }else if ([inputModel isEqualToString:@"en-US"]){

        if (position == nil) {

            if (currentStr.length > 20) {//限制英文的长度,不做英文长度限制的可以不要这个else if

                textField.text = [textField.text substringToIndex:20];

            }

        }

    }

}

 

 

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    

    NSMutableString *currentStr = [[NSMutableString alloc] initWithString:textField.text];

    

    [currentStr insertString:string atIndex:range.location];

    

    //当前的输入语言

    NSString *inputModel = [[textField textInputMode] primaryLanguage];

//    NSLog(@"%@ %@",currentRange,selectoRange);

//    NSLog(@"%@ %@",string,textField.text);

//    NSLog(@"%@ %@ --- currentStr.length:%ld  返回值:%d",NSStringFromRange(range),string,currentStr.length,currentStr.length < 6);

//    NSLog(@"position:%@\n\n",textPosition);

 

    if ([inputModel isEqualToString:@"zh-Hans"]) {

        if (currentStr.length > 10) {

//其实此方法限制主要是分多次限制,用户如果一直点输入而不选择具体文字的话,就会出现一串很长的联想词,这时用户突然点击选择了全部的联想词,在这个代理方法中是无法监测到的,所以这时会跑到:- (void)textFieldDidChange:(UITextField *)textField这个方法中,这个方法是截取前10位文字,假如刚用户的全部联想词是20个,你突然给人家截成10个,这样用户体验效果就不好!所以在这个方法给个初步的大概范围判定

            if (currentStr.length >= range.length && range.length != 0) {

                [currentStr deleteCharactersInRange:kRANGE(range.location, 1)];

                //把删除后的字符给textfield,不然无法进行删除

                textField.text = currentStr;

            }

        }

    }else{

    //do something

    }

        return currentStr.length <= 10;//把return放最后防止用户输入表情的时候不会被记录

}

 

posted @ 2016-07-21 14:31  nenhallwu  阅读(458)  评论(0)    收藏  举报