前言
最近在開發(fā)的時候遇到一個問題,就是需要限制TextField中輸入的字符串的長度,但是不是直接根據(jù)長度限制,而是根據(jù)字符數(shù)限制,一個漢字為兩個字節(jié),數(shù)字字母為一個字符。超過字符限制則不允許繼續(xù)輸入并彈出toast提示。
這個問題有三個關(guān)鍵點(diǎn):判斷字符串是否超出長度,超出長度不可輸入,判斷字符串的字符數(shù)。
下面話不多說了,來一起看看詳細(xì)的介紹吧
方法如下:
1、判斷字符串是否超出長度
[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ù)時所要做的事 }}
為什么在這里要自己監(jiān)聽textField中文字的變化,而不直接使用textField的代理方法-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
?
因?yàn)檫@個方法在中文書輸入法下,只能輸入一個詞的情況,如果聯(lián)想詞是兩個詞,也可以輸入。所以會出現(xiàn)誤差。直接監(jiān)聽UIControlEventEditingChanged 是最靠譜的。
2、超出長度不可輸入
if (self.textField.text.length > MAXLENGTH) // MAXLENGTH為最大字?jǐn)?shù) { self.textField.text = [self.txfUsername.text substringToIndex: MAXLENGTH]; // MAXLENGTH為最大字?jǐn)?shù) }
如果超出長度,永遠(yuǎn)把前MAXLENGTH的子字符串賦給textField的text,即textField永遠(yuǎn)只顯示前MAXLENGTH個字,視覺效果就是無法繼續(xù)輸入。
3、前面所有用到的MAXLENGTH均為字符串長度,不論數(shù)字字母還是漢字,最后要解決的問題就是判斷字符數(shù)。
//按照中文兩個字符,英文數(shù)字一個字符計算字符數(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是按照英文一個字符,中文三個字符來編碼的,NSUnicodeStringEncoding是按照英文數(shù)字漢字都是兩個字符編碼的,目前iOS中的編碼方法都和需求不符,所以需要另外做計算。
因?yàn)樽约簩ψ址幋a不了解,所以沒有想到正確的辦法。這個方法是在網(wǎng)上找了好久才找到。來源ymonke。但是在使用過程中發(fā)現(xiàn)返回值有問題,于是做了修改,結(jié)果如上代碼。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選