需求
require:
項目里經(jīng)常有一種需求,需要限制用戶輸入的字?jǐn)?shù),但是有的PM為了更好的用戶體驗,允許用戶在沒有確認(rèn)前可以無限輸入
optional:
1.不允許輸入emoji表情
2.不允許輸入空格等
效果
[圖片上傳失敗...(image-987102-1563792426755)]
分析
有幾種場景
1.各種輸入法
2.輸入非法字符
3.輸入的中文拼音還沒選文字就點確定了
4.你們補充下...
實現(xiàn)
創(chuàng)建一個彈框,監(jiān)聽輸入
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"test" message:@"msg" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField *textFiled = [alertView textFieldAtIndex:0];
textFiled.delegate = self;
//監(jiān)聽輸入
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:textFiled];
[alertView show];
記得遵守協(xié)議
@interface ViewController ()<UIAlertViewDelegate,UITextFieldDelegate>
給定一個限制數(shù)
#define kMaxLableLength 10 //限制10個字符
過濾非法文字
因為咱們要過濾非法字符嘛,那么先把方法準(zhǔn)備好,一會兒直接調(diào)就好啦
//過濾非法字符
- (NSString *)disable_Text:(NSString *)text
{
NSLog(@"過濾--->%@",text);
text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
text = [text stringByReplacingOccurrencesOfString:@"\n" withString:@""];
//過濾emoji表情
return [self disable_emoji:text];
}
//過濾emoj表情
- (NSString *)disable_emoji:(NSString *)text
{
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]" options:NSRegularExpressionCaseInsensitive error:nil];
NSString *modifiedString = [regex stringByReplacingMatchesInString:text
options:0
range:NSMakeRange(0, [text length])
withTemplate:@""];
return modifiedString;
}
獲取輸入文字
這一步我們需要實時獲取用戶輸入的文字,并且交給一個專門的檢驗方法來檢驗
- (void)textFiledEditChanged:(NSNotification *)noti
{
UITextField *textField = (UITextField *)noti.object;
[self validationText:textField];
}
檢驗文字內(nèi)容
檢驗之前先去掉空格等非法字符吧,調(diào)用之前準(zhǔn)備好的方法,一步到位過濾完全
NSString *toBeString = [self disable_Text:textField.text];
咱們是不是直接截斷就可以了?
NSString *strNew = [NSString stringWithString:toBeString];
[textField setText:[strNew substringToIndex:kMaxLableLength]];
項目經(jīng)理會打死你的.....因為還有各種小細(xì)節(jié)需要處理呢
咱們需要判斷輸入法,英文的直接截斷就好啦,中文的咱們要允許他在有光標(biāo)光亮的狀態(tài)下可以無限輸入文字
完整代碼如下
- (NSString *)validationText:(UITextField *)textField
{
//不論中文英文,如果有空格,回車,都要過濾掉
NSString *toBeString = [self disable_Text:textField.text];
NSString *lang = [textField.textInputMode primaryLanguage];
NSLog(@"%@",lang);
//判斷輸入法
if ([lang isEqualToString:@"zh-Hans"]) {
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if (!position) {
if (toBeString.length>=kMaxLableLength) {
NSString *strNew = [NSString stringWithString:toBeString];
[textField setText:[strNew substringToIndex:kMaxLableLength]];
}else{
[textField setText:toBeString];
}
}
else
{
NSLog(@"輸入的英文還沒有轉(zhuǎn)化為漢字的狀態(tài)");
}
}
else{
if (toBeString.length > kMaxLableLength) {
textField.text = [toBeString substringToIndex:kMaxLableLength];
}else{
textField.text = toBeString;
}
}
return textField.text;
}
完
大功告成!測試下,恩,OK~
小明:拿給PM秀一下順便問問TA晚上約不約
PM:秀你妹啊!
PM:完個蛋啊!
PM:有bug!
PM:用戶直接點確認(rèn)怎么辦!!!
PM:用戶體驗!用戶體驗!用戶體驗!重說三
小明:????????
改bug
是呀,用戶在光標(biāo)狀態(tài)下,直接輸入一大堆光標(biāo)咱們是不限制,如果他直接點確認(rèn),光標(biāo)內(nèi)容也是會被記錄的~
還有個小細(xì)節(jié):如果用戶一進(jìn)來,什么都不輸入直接點確認(rèn)咱們要攔截這個操作(PM如果有需求的話)
fix it!
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
UITextField *textFiled = [alertView textFieldAtIndex:0];
[textFiled resignFirstResponder];
//什么都不輸入直接返回
if (textFiled.text.length == 0) return;
//用戶不選擇文字直接確認(rèn)
self.displayLable.text = [self validationText:textFiled];
}
}
完
小明終于可以約PM了~