不積跬步,無以至千里;不積小流,無以成江海
在iOS開發中,輸入框是很常用的,比如登錄、修改個人信息等等,在使用輸入框就會有字數的限制問題。
一開始想到的是直接通過代理來限制字數:
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string;
在代理里面通過當前textField的text加上新輸入的string的總長度來判斷字數是否超過。一開始覺得好像解決了問題,測試的時候發現當輸入類型為中文時會出現下面問題:
markText.png
輸入的拼音并不是最終的輸入內容,但是也計算了相應的長度,這樣發現到最后一個字符的時候不能輸入內容了。這樣對用戶是很不友好的
接下來就是解決問題:
在中文輸入法時,輸入的高亮文本其實是不能算輸入內容的,如圖的“514gg”,“gg”是不能算作輸入內容的
解決方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSInteger maxCount = 10;
//高亮文本的Range(是否有高亮文本)
UITextRange *selectedRange = textField.markedTextRange;
//textField中的高亮文本在textField文本中location
NSInteger location = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selectedRange.start];
NSString *str = nil;
if (selectedRange) {
//截取去掉高亮剩下的內容
str = [textField.text substringWithRange:(NSMakeRange(0, location))];
}else{
str = textField.text;
}
//如果總長度超過字數限制,就截取
if (string.length + str.length > maxCount) {
NSString *newStr = [str stringByAppendingString:string];
textField.text = [newStr substringWithRange:NSMakeRange(0, maxCount)];
return NO;
}
if ([string isEqualToString:@"\n"]) {
//按回車關閉鍵盤
[textField resignFirstResponder];
return NO;
}else if(string.length == 0){
//判斷是不是刪除鍵
return YES;
}else{
return YES;
}
return YES;
}
ok!
跑得慢,聽到的是罵聲; 跑得快,聽到的就只是風聲