iOS中textField限制字符串長(zhǎng)度、字符數(shù)的方法
前言
最近在開發(fā)的時(shí)候遇到一個(gè)問題,就是需要限制TextField中輸入的字符串的長(zhǎng)度,但是不是直接根據(jù)長(zhǎng)度限制,而是根據(jù)字符數(shù)限制,一個(gè)漢字為兩個(gè)字節(jié),數(shù)字字母為一個(gè)字符。超過字符限制則不允許繼續(xù)輸入并彈出toast提示。
這個(gè)問題有三個(gè)關(guān)鍵點(diǎn):判斷字符串是否超出長(zhǎng)度,超出長(zhǎng)度不可輸入,判斷字符串的字符數(shù)。
下面話不多說了,來一起看看詳細(xì)的介紹吧
方法如下:
1、判斷字符串是否超出長(zhǎng)度
[self.txfUsername addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; - (void)textFieldDidChange:(id)sender { if (self.textField.text.length > MAXLENGTH) // MAXLENGTH為最大字?jǐn)?shù) { //超出限制字?jǐn)?shù)時(shí)所要做的事 } }
為什么在這里要自己監(jiān)聽textField中文字的變化,而不直接使用textField的代理方法-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
?
因?yàn)檫@個(gè)方法在中文書輸入法下,只能輸入一個(gè)詞的情況,如果聯(lián)想詞是兩個(gè)詞,也可以輸入。所以會(huì)出現(xiàn)誤差。直接監(jiān)聽UIControlEventEditingChanged 是最靠譜的。
2、超出長(zhǎng)度不可輸入
if (self.textField.text.length > MAXLENGTH) // MAXLENGTH為最大字?jǐn)?shù) { self.textField.text = [self.txfUsername.text substringToIndex: MAXLENGTH]; // MAXLENGTH為最大字?jǐn)?shù) }
如果超出長(zhǎng)度,永遠(yuǎn)把前MAXLENGTH的子字符串賦給textField的text,即textField永遠(yuǎn)只顯示前MAXLENGTH個(gè)字,視覺效果就是無法繼續(xù)輸入。
3、前面所有用到的MAXLENGTH均為字符串長(zhǎng)度,不論數(shù)字字母還是漢字,最后要解決的問題就是判斷字符數(shù)。
//按照中文兩個(gè)字符,英文數(shù)字一個(gè)字符計(jì)算字符數(shù) -(NSUInteger) unicodeLengthOfString: (NSString *) text { NSUInteger asciiLength = 0; for (NSUInteger i = 0; i < text.length; i++) { unichar uc = [text characterAtIndex: i]; asciiLength += isascii(uc) ? 1 : 2; } return asciiLength; }
NSUInteger lenOfBytes = [text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
也試過,lengthOfBytesUsingEncoding就是按照編碼返回字節(jié)數(shù),但是NSUTF8StringEncoding是按照英文一個(gè)字符,中文三個(gè)字符來編碼的,NSUnicodeStringEncoding是按照英文數(shù)字漢字都是兩個(gè)字符編碼的,目前iOS中的編碼方法都和需求不符,所以需要另外做計(jì)算。
因?yàn)樽约簩?duì)字符編碼不了解,所以沒有想到正確的辦法。這個(gè)方法是在網(wǎng)上找了好久才找到。來源ymonke。但是在使用過程中發(fā)現(xiàn)返回值有問題,于是做了修改,結(jié)果如上代碼。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- IOS textField限制字節(jié)長(zhǎng)度
- iOS UITextField最大字符數(shù)和字節(jié)數(shù)的限制詳解
- 僅幾行iOS代碼限制TextField輸入長(zhǎng)度
- iOS UITextField、UITextView只限輸入中文、英文、數(shù)字及實(shí)時(shí)限制字符個(gè)數(shù)的封裝實(shí)現(xiàn)代碼
- 解決iOS7上UITextField限制字?jǐn)?shù)輸入導(dǎo)致崩潰問題的方法
- IOS 開發(fā)之 UITextField限制字?jǐn)?shù)的方法
- IOS中UITextView或UITextField字?jǐn)?shù)限制的實(shí)現(xiàn)
相關(guān)文章
iOS中UITableview錯(cuò)位的問題怎么修復(fù)
這篇文章主要介紹了iOS中UITableview錯(cuò)位的問題以及修復(fù)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-01-01iOS評(píng)分(評(píng)價(jià))星星圖打分功能
這篇文章主要介紹了iOS評(píng)分(評(píng)價(jià))星星圖打分功能,評(píng)分視圖分為展示和評(píng)分兩種,具體詳情大家可以通過本文詳細(xì)學(xué)習(xí)2016-11-11解決移動(dòng)端 ios 系統(tǒng)鍵盤遮擋的問題
下面小編就為大家分享一篇解決移動(dòng)端 ios 系統(tǒng)鍵盤遮擋的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12iOS實(shí)現(xiàn)多個(gè)垂直滑動(dòng)條并列視圖
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)多個(gè)垂直滑動(dòng)條并列視圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03iOS打電話、發(fā)短信、發(fā)郵件實(shí)例代碼
這篇文章主要為大家詳細(xì)介紹了iOS打電話、發(fā)短信、發(fā)郵件實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11iOS如何固定UITableView中cell.imageView.image的圖片大小
這篇文章主要給大家介紹了關(guān)于iOS如何固定UITableView中cell.imageView.image圖片大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11講解Java中如何構(gòu)造內(nèi)部類對(duì)象以及訪問對(duì)象
這篇文章主要介紹了講解Java中如何構(gòu)造內(nèi)部類對(duì)象以及訪問對(duì)象,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09IOS開發(fā)教程之put上傳文件的服務(wù)器的配置及實(shí)例分享
IOS開發(fā)給人一種高大上的趕腳,弄的好像你不會(huì)IOS就不是個(gè)合格的程序員一樣,好吧,既然是大趨勢(shì),那我們就來學(xué)習(xí)下吧,今天來看看put上傳文件的服務(wù)器配置及案例2014-06-06iOS開發(fā)實(shí)現(xiàn)下載器的基本功能(1)
這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)實(shí)現(xiàn)下載器基本功能的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-07-07iOS實(shí)現(xiàn)獲取系統(tǒng)iTunes音樂的方法示例
這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)獲取系統(tǒng)iTunes音樂的相關(guān)資料,文中通過示例代碼給大家詳細(xì)介紹了實(shí)現(xiàn)的方法,并給大家介紹了MPMediaPickerController的相關(guān)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11