iOS之限制 textfield 的輸入字?jǐn)?shù)/不限制光標(biāo)字?jǐn)?shù)

需求

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了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容