彻底解决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放最后防止用户输入表情的时候不会被记录
}
著作权归作者所有,转载请联系作者获得授权,并标注“博客作者”。

浙公网安备 33010602011771号