【轉(zhuǎn)】完美限制UITextField的輸入長(zhǎng)度

要限制一個(gè)UITextField的輸入字?jǐn)?shù)惭蟋,很多人首先想到的是通過(guò)UITextFieldDelegate下面這個(gè)代理方法實(shí)現(xiàn):

```

- (BOOL)textField:(UITextField *)textField

shouldChangeCharactersInRange:(NSRange)range

replacementString:(NSString *)string;//return NO to not change text

例如要設(shè)置字?jǐn)?shù)限制為10:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

? ? if (textField == self.titleField) {

if (textField.length >=10) return NO;

? ? }

? ? return YES;

}

```

此列的缺點(diǎn):

1达罗、此時(shí)要添加到textField的文字并未寫入textField榜苫,我們判斷的是已經(jīng)輸入的文字是否超過(guò)10個(gè)断医,如果輸入了9個(gè),然而最后一次直接拼音出來(lái)好幾個(gè)字蔬捷,此時(shí)也是可以輸入的蓄坏,所以range和string參數(shù)是一定要使用的,range說(shuō)明文字要插入的文字將要放置的位置枫慷,string為將要插入的字符串让蕾。

2、聯(lián)想詞的輸入不通知此代理函數(shù)或听,所以如果通過(guò)聯(lián)想詞輸入的話探孝,想輸入多少文字都可以

3、輸入超過(guò)10個(gè)字之后退格鍵不能用

4誉裆、當(dāng)使用拼音輸入法時(shí)顿颅,該委托方法中的最后一個(gè)參數(shù)string接受的是輸入的字母,而不是選擇的漢字足丢,造成的結(jié)果是粱腻,當(dāng)想輸入文字“我在編程”,輸入拼音“wozaibiancheng”霎桅,每輸入一個(gè)字母便會(huì)進(jìn)入委托方法栖疑,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度滔驶,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入遇革。而且,致命的是揭糕,這個(gè)委托方法并不響應(yīng)萝快,選中候選漢字的過(guò)程即這個(gè)委托方法沒(méi)有響應(yīng)最后拼音到漢字的過(guò)程),這就沒(méi)有辦法重新修正字符長(zhǎng)度的統(tǒng)計(jì)了著角。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

{

? ? if (textField == self.titleField) {

? ? ? ? if (string.length == 0) return YES;

? ? ? ?NSMutableString *newtxt = [NSMutableString stringWithString:textField.text];

? ? ? ? [newtxt replaceCharactersInRange:range withString:string];

? ? ? ? if (newtxt.length > 10) return NO;

? ? }

? ? return YES;

}

此列的缺點(diǎn):

1揪漩、聯(lián)想詞的輸入不通知此代理函數(shù),所以如果通過(guò)聯(lián)想詞輸入的話吏口,想輸入多少文字都可以

2奄容、輸入超過(guò)10個(gè)字之后退格鍵不能用

3、當(dāng)使用拼音輸入法時(shí)产徊,該委托方法中的最后一個(gè)參數(shù)string接受的是輸入的字母昂勒,而不是選擇的漢字,造成的結(jié)果是舟铜,當(dāng)想輸入文字“我在編程”戈盈,輸入拼音“wozaibiancheng”,每輸入一個(gè)字母便會(huì)進(jìn)入委托方法,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度塘娶,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度归斤,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入。而且刁岸,致命的是脏里,這個(gè)委托方法并不響應(yīng),選中候選漢字的過(guò)程(即這個(gè)委托方法沒(méi)有響應(yīng)最后拼音到漢字的過(guò)程)虹曙,這就沒(méi)有辦法重新修正字符長(zhǎng)度的統(tǒng)計(jì)了膝宁。

對(duì)于聯(lián)想詞的問(wèn)題,我們還可以通過(guò)-(void)textFieldDidEndEditing:(UITextField *)textField;代理方法在結(jié)束編輯的時(shí)候把文本截?cái)喔酰怯脩趔w驗(yàn)很差,因?yàn)橛脩魰?huì)看到輸入的文字在輸入完成時(shí)突然少了幾個(gè)合蔽。此時(shí)希望有類似-(void)textFieldDidChange:(UITextField *)textField的代理方法击敌,但可惜沒(méi)有。不過(guò)天無(wú)絕人之路拴事,UITextField有UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification這個(gè)消息通知(切記沃斤,監(jiān)聽(tīng)消息還要記得解除監(jiān)聽(tīng)),UITextField本身提供了相應(yīng)的事件監(jiān)聽(tīng)

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

這樣就可以更好地限制輸入長(zhǎng)度:

- (void)textFieldDidChange:(UITextField *)textField

{

? ? if (textField == self.titleField) {

? ? ? ? if (textField.text.length > 10) {

? ? ? ? ? ? textField.text = [textField.text substringToIndex:10];

? ? ? ? }

? ? }

}

此列的缺點(diǎn):

1刃宵、對(duì)于純字符的統(tǒng)計(jì)沒(méi)有什么問(wèn)題衡瓶,但是,當(dāng)使用拼音輸入法時(shí)牲证,該方法中的最后一個(gè)參數(shù)string接受的是輸入的字母哮针,而不是選擇的漢字,造成的結(jié)果是坦袍,當(dāng)想輸入文字“我在編程”十厢,輸入拼音“wozaibiancheng”,每輸入一個(gè)字母便會(huì)進(jìn)入方法捂齐,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度蛮放,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入奠宜。

解決辦法如下:

- (void) textFieldDidChange:(UITextField *)textField

{

? ? NSInteger kMaxLength = 8;

? ? NSString *toBeString = textField.text;

? ? NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; //ios7之前使用[UITextInputMode currentInputMode].primaryLanguage

? ? if ([lang isEqualToString:@"zh-Hans"]) { //中文輸入

? ? ? ? UITextRange *selectedRange = [textField markedTextRange];

? ? ? ? //獲取高亮部分

? ? ? ? UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];

? ? ? ? if (!position) {// 沒(méi)有高亮選擇的字包颁,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制

? ? ? ? ? ? if (toBeString.length > kMaxLength) {

? ? ? ? ? ? ? ? textField.text = [toBeString substringToIndex:kMaxLength];

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? else{//有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制

? ? ? ? }

? ? }else{//中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可压真,不考慮其他語(yǔ)種情況

? ? ? ? if (toBeString.length > kMaxLength) {

? ? ? ? ? ? textField.text = [toBeString substringToIndex:kMaxLength];

? ? ? ? }

? ? }

}

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娩嚼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子榴都,更是在濱河造成了極大的恐慌待锈,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘴高,死亡現(xiàn)場(chǎng)離奇詭異竿音,居然都是意外死亡和屎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門春瞬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柴信,“玉大人,你說(shuō)我怎么就攤上這事宽气∷娉#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵萄涯,是天一觀的道長(zhǎng)绪氛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涝影,這世上最難降的妖魔是什么枣察? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮燃逻,結(jié)果婚禮上序目,老公的妹妹穿的比我還像新娘。我一直安慰自己伯襟,他們只是感情好猿涨,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著姆怪,像睡著了一般叛赚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稽揭,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天红伦,我揣著相機(jī)與錄音,去河邊找鬼淀衣。 笑死昙读,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膨桥。 我是一名探鬼主播蛮浑,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼只嚣!你這毒婦竟也來(lái)了沮稚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤册舞,失蹤者是張志新(化名)和其女友劉穎蕴掏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盛杰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年挽荡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即供。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡定拟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逗嫡,到底是詐尸還是另有隱情青自,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布驱证,位于F島的核電站延窜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抹锄。R本人自食惡果不足惜需曾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祈远。 院中可真熱鬧,春花似錦商源、人聲如沸车份。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扫沼。三九已至,卻和暖如春庄吼,著一層夾襖步出監(jiān)牢的瞬間缎除,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工总寻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留器罐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓渐行,卻偏偏與公主長(zhǎng)得像轰坊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祟印,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361