iOS UITextField輸入限制(中英文混合

先說說記錄這個(gè)的原因吧腺逛,關(guān)于限制UITextField的輸入字?jǐn)?shù)的各種需求著拭,已經(jīng)疲軟了纱扭,工作幾年中用的還真不少,有只要字?jǐn)?shù)長(zhǎng)度的儡遮,也有字符長(zhǎng)度的乳蛾,當(dāng)然這個(gè)就包括中文和英文,還有.....標(biāo)點(diǎn)符號(hào)也分中文和英文的鄙币,每次都多不情愿的寫這個(gè)地方屡久,閑來無事,就來記錄一下爱榔,方便大家,若有不對(duì)的地方糙及,多多指教哈详幽。關(guān)于UITextField大家肯定對(duì)下面這個(gè)方法非常熟悉- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string那么這個(gè)函數(shù)的大概意思是什么呢?我是這么理解的(個(gè)人認(rèn)為)由于返回的是個(gè) BOOL 所以我猜想大概就是我們?cè)谳斎氲臅r(shí)候浸锨,是否對(duì)UITextField 的內(nèi)容進(jìn)行修改下面來簡(jiǎn)單分析下參數(shù)textField 這個(gè)參數(shù)大家都懂唇聘,就是響應(yīng)該協(xié)議的UITextField對(duì)象range在這個(gè)函數(shù)中,添加了打印信息柱搜,測(cè)試了下- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{? ? ? ? NSLog(@" 打印信息:%lu? -----%lu ",(unsigned long)range.location,(unsigned long)range.length);}//打印log2017-01-25 17:48:49.826 TestObject[5502:683375]? 打印信息toBeString:Zxtgfd2017-01-25 17:48:50.506 TestObject[5502:683375]? 打印信息:6? -----0 2017-01-25 17:48:50.508 TestObject[5502:683375]? 打印信息toBeString:Zxtgfda2017-01-25 17:48:51.894 TestObject[5502:683375]? 打印信息:6? -----1由此可以看到迟郎,在輸入的時(shí)候,range.length為0聪蘸,range.location為插入時(shí)的位置 宪肖,range.length為1時(shí),是我在點(diǎn)擊刪除的時(shí)候打印的健爬,應(yīng)該可以表示刪除(不確定)string string.length為0時(shí)控乾,表示刪除。限制輸入長(zhǎng)度1 如果只是輸入英文狀態(tài)娜遵,或者數(shù)字狀態(tài)蜕衡,那么我們我們可以利用這個(gè)函數(shù),實(shí)現(xiàn)方法為:- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{? ? ? ? NSLog(@" 打印信息:%lu? -----%lu ",(unsigned long)range.location,(unsigned long)range.length);? ? if (textField.text.length + string.length > kMaxNumber) {? ? ? ? return NO;? ? }? ? //刪除按鈕? ? if (string.length == 0)? ? {? ? ? ? return YES;? ? }? ? return YES;}2 但是设拟,如果要涉及到中文的話慨仿,這樣就不行了。因?yàn)槟呻剩谳斎胫形牡臅r(shí)候镰吆,如果你還沒有確定所輸入的中文,那么UITextField此時(shí)接收的并不是中文躲雅,而是對(duì)應(yīng)的拼音鼎姊,比如你想輸入漢字君不見黃河之水天上來 那么對(duì)應(yīng)的拼音則是junbujianhuanghezhishuitianshanglai這么一來,比如你想限制的輸入個(gè)數(shù)為10 那么只能輸入到j(luò)unbujianh這個(gè)位置。那么我們?cè)撛趺唇鉀Q問題呢相寇,進(jìn)入API我們可以發(fā)現(xiàn)慰于。UITextField : UIControl? ---- UITextField繼承自UIControl有如下函數(shù)- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;typedef NS_OPTIONS(NSUInteger, UIControlEvents) {? ? UIControlEventTouchDown? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 0,? ? ? // on all touch downs? ? UIControlEventTouchDownRepeat? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 1,? ? ? // on multiple touchdowns (tap count > 1)? ? UIControlEventTouchDragInside? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 2,? ? UIControlEventTouchDragOutside? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 3,? ? UIControlEventTouchDragEnter? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 4,? ? UIControlEventTouchDragExit? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 5,? ? UIControlEventTouchUpInside? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 6,? ? UIControlEventTouchUpOutside? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 7,? ? UIControlEventTouchCancel? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 <<? 8,? ? UIControlEventValueChanged? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 << 12,? ? // sliders, etc.? ? UIControlEventPrimaryActionTriggered NS_ENUM_AVAILABLE_IOS(9_0) = 1 << 13,? ? // semantic action: for buttons, etc.? ? UIControlEventEditingDidBegin? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 << 16,? ? // UITextField? ? UIControlEventEditingChanged? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 << 17,? ? UIControlEventEditingDidEnd? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 << 18,? ? UIControlEventEditingDidEndOnExit? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 1 << 19,? ? // 'return key' ending editing? ? UIControlEventAllTouchEvents? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x00000FFF,? // for touch events? ? UIControlEventAllEditingEvents? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x000F0000,? // for UITextField? ? UIControlEventApplicationReserved? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x0F000000,? // range available for application use? ? UIControlEventSystemReserved? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0xF0000000,? // range reserved for internal framework use? ? UIControlEventAllEvents? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0xFFFFFFFF};我們可以利用此函數(shù)和對(duì)應(yīng)的枚舉UIControlEventEditingChanged來監(jiān)測(cè)輸入的內(nèi)容變化,從而控制輸入的字?jǐn)?shù)代碼如下- (void)textFiledDidChange:(UITextField *)textField{? ? if (kMaxNumber == 0) return;? ? NSString *toBeString = textField.text;? ? NSLog(@" 打印信息toBeString:%@",toBeString);? ? NSString *lang = [[textField textInputMode] primaryLanguage]; // 鍵盤輸入模式? ? if ([lang isEqualToString:@"zh-Hans"]) { // 簡(jiǎn)體中文輸入唤衫,包括簡(jiǎn)體拼音婆赠,健體五筆,簡(jiǎn)體手寫? ? ? ? //判斷markedTextRange是不是為Nil佳励,如果為Nil的話就說明你現(xiàn)在沒有未選中的字符休里,? ? ? ? //可以計(jì)算文字長(zhǎng)度。否則此時(shí)計(jì)算出來的字符長(zhǎng)度可能不正確? ? ? ? UITextRange *selectedRange = [textField markedTextRange];? ? ? ? //獲取高亮部分(感覺輸入中文的時(shí)候才有)? ? ? ? UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];? ? ? ? // 沒有高亮選擇的字赃承,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制? ? ? ? if (!position)? ? ? ? {? ? ? ? ? ? //中文和字符一起檢測(cè)? 中文是兩個(gè)字符? ? ? ? ? ? if ([toBeString getStringLenthOfBytes] > kMaxNumber)? ? ? ? ? ? {? ? ? ? ? ? ? ? textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];? ? ? ? ? ? }? ? ? ? }? ? }? ? else? ? {? ? ? ? if ([toBeString getStringLenthOfBytes] > kMaxNumber)? ? ? ? {? ? ? ? ? ? textField.text = [toBeString subBytesOfstringToIndex:kMaxNumber];? ? ? ? }? ? }}其中有正則表達(dá)式的驗(yàn)證妙黍,方法我是寫在NSString的擴(kuò)展中的,具體如下//.h文件#import@interface NSString (category)

- (NSInteger)getStringLenthOfBytes;

- (NSString *)subBytesOfstringToIndex:(NSInteger)index;

@end

//.m文件

#import "NSString+category.h"

@implementation NSString (category)

- (NSInteger)getStringLenthOfBytes

{

NSInteger length = 0;

for (int i = 0; i<[self length]; i++) {

//截取字符串中的每一個(gè)字符

NSString *s = [self substringWithRange:NSMakeRange(i, 1)];

if ([self validateChineseChar:s]) {

NSLog(@" s 打印信息:%@",s);

length +=2;

}else{

length +=1;

}

NSLog(@" 打印信息:%@? %ld",s,(long)length);

}

return length;

}

- (NSString *)subBytesOfstringToIndex:(NSInteger)index

{

NSInteger length = 0;

NSInteger chineseNum = 0;

NSInteger zifuNum = 0;

for (int i = 0; i<[self length]; i++) {

//截取字符串中的每一個(gè)字符

NSString *s = [self substringWithRange:NSMakeRange(i, 1)];

if ([self validateChineseChar:s])

{

if (length + 2 > index)

{

return [self substringToIndex:chineseNum + zifuNum];

}

length +=2;

chineseNum +=1;

}

else

{

if (length +1 >index)

{

return [self substringToIndex:chineseNum + zifuNum];

}

length+=1;

zifuNum +=1;

}

}

return [self substringToIndex:index];

}

//檢測(cè)中文或者中文符號(hào)

- (BOOL)validateChineseChar:(NSString *)string

{

NSString *nameRegEx = @"[\\u0391-\\uFFE5]";

if (![string isMatchesRegularExp:nameRegEx]) {

return NO;

}

return YES;

}

//檢測(cè)中文

- (BOOL)validateChinese:(NSString*)string

{

NSString *nameRegEx = @"[\u4e00-\u9fa5]";

if (![string isMatchesRegularExp:nameRegEx]) {

return NO;

}

return YES;

}

- (BOOL)isMatchesRegularExp:(NSString *)regex {

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

return [predicate evaluateWithObject:self];

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞧剖,一起剝皮案震驚了整個(gè)濱河市拭嫁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抓于,老刑警劉巖做粤,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捉撮,居然都是意外死亡怕品,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門巾遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肉康,“玉大人,你說我怎么就攤上這事恢总∮蓿” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵片仿,是天一觀的道長(zhǎng)纹安。 經(jīng)常有香客問我,道長(zhǎng)砂豌,這世上最難降的妖魔是什么厢岂? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮阳距,結(jié)果婚禮上塔粒,老公的妹妹穿的比我還像新娘。我一直安慰自己筐摘,他們只是感情好卒茬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布船老。 她就那樣靜靜地躺著,像睡著了一般圃酵。 火紅的嫁衣襯著肌膚如雪柳畔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天郭赐,我揣著相機(jī)與錄音薪韩,去河邊找鬼。 笑死捌锭,一個(gè)胖子當(dāng)著我的面吹牛俘陷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播观谦,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拉盾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了豁状?” 一聲冷哼從身側(cè)響起盾剩,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎替蔬,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屎暇,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡承桥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了根悼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凶异。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挤巡,靈堂內(nèi)的尸體忽然破棺而出剩彬,到底是詐尸還是另有隱情,我是刑警寧澤矿卑,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布喉恋,位于F島的核電站,受9級(jí)特大地震影響母廷,放射性物質(zhì)發(fā)生泄漏轻黑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一琴昆、第九天 我趴在偏房一處隱蔽的房頂上張望氓鄙。 院中可真熱鬧,春花似錦业舍、人聲如沸抖拦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽态罪。三九已至噩茄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間向臀,已是汗流浹背巢墅。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留券膀,地道東北人君纫。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像芹彬,于是被迫代替她去往敵國(guó)和親蓄髓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容