UITextfield和UITextView的字數限定問題

不積跬步,無以至千里;不積小流,無以成江海


在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!

跑得慢,聽到的是罵聲; 跑得快,聽到的就只是風聲


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容