iOS輸入框字數達限制酗洒,不能輸入拼音

? ? ? ? iOS遇到輸入框輸入時,藍色的拼音文字也是屬于textField的內容枷遂,一般的textField.text的length時會算進去樱衷,所以這里不太好判斷,要是如果遇到了強迫癥的產品經理一定要你在輸入文字達到最大長度時酒唉,連拼音都不能輸入矩桂,那就麻煩了。

? ? ? ?不過別慌痪伦,這里有教程侄榴,保證你能滿足需求阔籽,本文是在三方基礎上改的 <RestrictionInput>, 末尾回復上該源碼,可直接食用牲蜀,如果對你有幫助點個贊或者收藏下

#import "GroupNameViewCtrl.h"
#import "RestrictionInput.h"

@interface GroupNameViewCtrl () <UITextFieldDelegate>
{
    NSInteger MAX_INPUT_LENGTH; // 中文字數限制字數笆制,轉化成英文兩倍
}
@property (nonatomic, strong) UIView *textBaseview;
@property (nonatomic, strong) UITextField *txtField;
@property (nonatomic, copy) NSString *currentText;
@property (nonatomic, assign) BOOL isStop;      // 字數達到最大時否停止輸入

@end

@implementation GroupNameViewCtrl

- (void)viewDidLoad {
    [super viewDidLoad];
    _isStop = NO;
    MAX_INPUT_LENGTH = 20;
    [self setNavi];
    [self setUI];
    
    if (!_isMaster) {
        self.rightBtn.hidden = YES;
        self.txtField.userInteractionEnabled = NO;
    }
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldChange:) name:UITextFieldTextDidChangeNotification object:nil];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)setNavi {
    [self.rightBtn setTitle:GET_LANGUAGE_KEY(@"OK") forState:UIControlStateNormal];
    [self.rightBtn setImage:nil forState:UIControlStateNormal];
    self.rightBtn.titleLabel.font = FONT_F3;
    self.rightBtn.titleLabel.adjustsFontSizeToFitWidth = YES;
}

- (void)setUI {
    [self.view addSubview:self.textBaseview];
    [self.textBaseview addSubview:self.txtField];
    UIButton *btnDelete = [[UIButton alloc] init];
    [btnDelete setImage:[UIImage imageNamed:@"clear"] forState:UIControlStateNormal];
    [btnDelete addTarget:self action:@selector(btnDeleteAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.textBaseview addSubview:btnDelete];
    
    [self.textBaseview mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.naviView.mas_bottom).offset(12);
        make.left.right.equalTo(self.view);
        make.height.equalTo(49);
    }];
    
    [self.txtField mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(self.textBaseview);
        make.left.equalTo(self.textBaseview).offset(15);
        make.right.equalTo(self.textBaseview).offset(-40);
    }];
    
    [btnDelete mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.textBaseview).offset(16);
        make.centerY.equalTo(self.textBaseview);
    }];
}

/*********** 正  文  開   始 ***********/

#pragma mark - notification

- (void)textFieldChange:(NSNotification *)noti {
    
    UITextField *txtView = (UITextField *)noti.object;
    //判斷輸入(不能輸入特殊字符)
    [RestrictionInput restrictionInputTextField:txtView maxNumber:MAX_INPUT_LENGTH*2+1 showErrorMessage:nil];
    NSString *toBeString = txtView.text;
    NSString *lang = [[txtView textInputMode] primaryLanguage];
    if([lang isEqualToString:@"zh-Hans"]) { //簡體中文輸入,包括簡體拼音涣达,健體五筆在辆,簡體手寫
        UITextRange *selectedRange = [txtView markedTextRange];
        UITextPosition *position = [txtView positionFromPosition:selectedRange.start offset:0];
        if (!position){//非高亮
            NSInteger length = [Utils getToLength:toBeString];
            if ((MAX_INPUT_LENGTH-length/2) > 0) {
                _isStop = NO;
            } else {
                _isStop = YES;
            }
        }
    }else{//中文輸入法以外
        NSInteger length = [Utils getToLength:toBeString];
        if ((MAX_INPUT_LENGTH-length/2) > 0) {
            _isStop = NO;
        } else {
            _isStop = YES;
        }
    }
}

-  (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([string isEqualToString:@""]) {
        return YES;
    }
    if ([string isEqualToString:@"\n"]) {
        [textField resignFirstResponder];
        return NO;
    }
    if (_isStop) {
        return NO;
    }
    
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [_txtField resignFirstResponder];
    return YES;
}

/*********** 正  文  結   束 ***********/

#pragma mark - event

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [_txtField resignFirstResponder];
}

- (void)clickLeftButton:(UIButton *)sender {
    [_txtField resignFirstResponder];
    _currentText = [self.txtField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if ([_currentText isEqualToString:_model.title]) {
        [self.navigationController popViewControllerAnimated:YES];
        return;
    }
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:GET_LANGUAGE_KEY(@"giveupModify") message:nil preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancel = [UIAlertAction actionWithTitle:GET_LANGUAGE_KEY(@"cancel") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    }];
    UIAlertAction *ok = [UIAlertAction actionWithTitle:GET_LANGUAGE_KEY(@"OK") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self.navigationController popViewControllerAnimated:YES];
    }];
    [alert addAction:cancel];
    [alert addAction:ok];
    [self presentViewController:alert animated:YES completion:nil];
}

- (void)clickRightButton:(UIButton *)sender {
    [_txtField resignFirstResponder];
    // 去掉首位空格
    _currentText = [self.txtField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    // 保存網絡請求吧啦吧啦吧啦
}

- (void)btnDeleteAction:(UIButton *)sender {
    _txtField.text = nil;
}

#pragma mark - setter and getter

- (UIView *)textBaseview {
    if (!_textBaseview) {
        _textBaseview = [[UIView alloc] init];
        _textBaseview.backgroundColor = COLOR_B7;
    }
    return _textBaseview;
}

- (UITextField *)txtField {
    if (!_txtField) {
        _txtField = [[UITextField alloc] init];
        _txtField.textColor = COLOR_B1;
        _txtField.font = FONT_F4;
        _txtField.returnKeyType = UIReturnKeyDone;
        _txtField.delegate = self;
        _txtField.text = _model.title;
        _txtField.placeholder = GET_LANGUAGE_KEY(@"inputGroupName");
        
        // 防止初始化的時候就達到最大值還能輸的情況
        NSInteger length = [Utils getToLength:_txtField.text];
        if ((MAX_INPUT_LENGTH-length/2) > 0) {
            _isStop = NO;
        } else {
            _isStop = YES;
        }
    }
    return _txtField;
}
@end

// RestrictionInput.h
#import <Foundation/Foundation.h>

@interface RestrictionInput : NSObject

+ (void)restrictionInputTextField:(UITextField *)inputClass maxNumber:(NSInteger)maxNumber showErrorMessage:(NSString *)errorMessage;

+ (void)restrictionInputTextView:(UITextView *)inputClass maxNumber:(NSInteger)maxNumber showErrorMessage:(NSString *)errorMessage checkChar:(BOOL)checkChar;

+ (BOOL)isInputRuleAndBlank:(NSString *)str regular:(NSString *)regular;

@end
//  RestrictionInput.m

#import "RestrictionInput.h"

@implementation RestrictionInput

+ (void)restrictionInputTextField:(UITextField *)inputClass maxNumber:(NSInteger)maxNumber showErrorMessage:(NSString *)errorMessage
{
    
    NSString *toBeString = inputClass.text;
    
    if (![self isInputRuleAndBlank:toBeString regular:REGULAR_EXPRESSION]) {
        inputClass.text = [self disable_emoji:toBeString];
        return;
    }
    
    NSString *lang = [[inputClass textInputMode] primaryLanguage]; // 獲取當前鍵盤輸入模式
    if([lang isEqualToString:@"zh-Hans"]) { //簡體中文輸入,第三方輸入法(搜狗)所有模式下都會顯示“zh-Hans”
        UITextRange *selectedRange = [inputClass markedTextRange];
        //獲取高亮部分
        UITextPosition *position = [inputClass positionFromPosition:selectedRange.start offset:0];
        //沒有高亮選擇的字,則對已輸入的文字進行字數統(tǒng)計和限制
        if(!position) {
            NSString *getStr = [self getSubString:toBeString maxNumber:maxNumber];
            if(getStr && getStr.length > 0) {
                inputClass.text = getStr;
                [Utils showToastMessage:errorMessage];
            }
        }
    } else{
        NSString *getStr = [self getSubString:toBeString maxNumber:maxNumber];
        if(getStr && getStr.length > 0) {
            inputClass.text= getStr;
        }
    }
}

+ (void)restrictionInputTextView:(UITextView *)inputClass maxNumber:(NSInteger)maxNumber showErrorMessage:(NSString *)errorMessage checkChar:(BOOL)checkChar
{
    NSString *toBeString = inputClass.text;
    
    if (checkChar) {
        if (![self isInputRuleAndBlank:toBeString regular:REGULAR_EXPRESSION]) {
            inputClass.text = [self disable_emoji:toBeString];
            return;
        }
    }
    
    NSString *lang = [[inputClass textInputMode] primaryLanguage]; // 獲取當前鍵盤輸入模式
    if([lang isEqualToString:@"zh-Hans"]) { //簡體中文輸入,第三方輸入法(搜狗)所有模式下都會顯示“zh-Hans”
        UITextRange *selectedRange = [inputClass markedTextRange];
        //獲取高亮部分
        UITextPosition *position = [inputClass positionFromPosition:selectedRange.start offset:0];
        //沒有高亮選擇的字度苔,則對已輸入的文字進行字數統(tǒng)計和限制
        if(!position) {
            NSString *getStr = [self getSubString:toBeString maxNumber:maxNumber];
            if(getStr && getStr.length > 0) {
                inputClass.text = getStr;
                [Utils showToastMessage:errorMessage];
            }
        }
    } else{
        NSString *getStr = [self getSubString:toBeString maxNumber:maxNumber];
        if(getStr && getStr.length > 0) {
            inputClass.text= getStr;
            [Utils showToastMessage:errorMessage];
        }
    }
}

/**
 *  獲得 kMaxLength長度的字符
 */
+ (NSString *)getSubString:(NSString*)string maxNumber:(NSInteger)maxNumber
{
    NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSData* data = [string dataUsingEncoding:encoding];
    NSInteger length = [data length];
    if (length > maxNumber) {
        NSData *data1 = [data subdataWithRange:NSMakeRange(0, maxNumber)];
        NSString *content = [[NSString alloc] initWithData:data1 encoding:encoding];//【注意4】:當截取kMaxLength長度字符時把中文字符截斷返回的content會是nil
        if (!content || content.length == 0) {
            data1 = [data subdataWithRange:NSMakeRange(0, maxNumber - 1)];
            content =  [[NSString alloc] initWithData:data1 encoding:encoding];
        }
        return content;
    }
    return nil;
}

/**
 * 字母匆篓、數字、中文正則判斷(不包括空格)
 */
+ (BOOL)isInputRuleNotBlank:(NSString *)str {
    NSString *pattern = @"^[????????\a-zA-Z\u4E00-\u9FA5\\d]*$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
    BOOL isMatch = [pred evaluateWithObject:str];
    return isMatch;
}
/**
 * 字母寇窑、數字鸦概、中文正則判斷(包括空格)【注意3】
 */
+ (BOOL)isInputRuleAndBlank:(NSString *)str regular:(NSString *)regular {
    
    //九宮格無法輸入解決需要加上正則 \????????
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regular];
    BOOL isMatch = [pred evaluateWithObject:str];
    return isMatch;
}

+ (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;
}

@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甩骏,隨后出現的幾起案子窗市,更是在濱河造成了極大的恐慌,老刑警劉巖饮笛,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咨察,死亡現場離奇詭異,居然都是意外死亡福青,警方通過查閱死者的電腦和手機摄狱,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來无午,“玉大人媒役,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵吃粒,是天一觀的道長崇堰。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮牡借,結果婚禮上,老公的妹妹穿的比我還像新娘袭异。我一直安慰自己钠龙,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碴里,像睡著了一般沈矿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬腋,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天羹膳,我揣著相機與錄音,去河邊找鬼根竿。 笑死陵像,一個胖子當著我的面吹牛,可吹牛的內容都是我干的寇壳。 我是一名探鬼主播醒颖,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼壳炎!你這毒婦竟也來了泞歉?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匿辩,失蹤者是張志新(化名)和其女友劉穎腰耙,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體撒汉,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡沟优,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年涕滋,在試婚紗的時候發(fā)現自己被綠了睬辐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾肺,死狀恐怖溯饵,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情锨用,我是刑警寧澤丰刊,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站增拥,受9級特大地震影響啄巧,放射性物質發(fā)生泄漏。R本人自食惡果不足惜掌栅,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一秩仆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猾封,春花似錦澄耍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢站。三九已至,卻和暖如春选酗,著一層夾襖步出監(jiān)牢的瞬間阵难,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工芒填, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留多望,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓氢烘,卻偏偏與公主長得像怀偷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子播玖,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355