在項(xiàng)目開(kāi)發(fā)過(guò)程中,將NSString類(lèi)型的字符串視為英文字母和中文字符的一個(gè)長(zhǎng)度,事實(shí)上,一個(gè)英文字母只需要一個(gè)字節(jié),一個(gè)漢字只需要兩個(gè)字節(jié),下文是武林技術(shù)頻道小編為您整理的IOS之textField限制字節(jié)長(zhǎng)度的實(shí)現(xiàn)方法,一起進(jìn)入下文了解一下吧!
有時(shí)又有需求,需要限定字節(jié)數(shù)目,而不是內(nèi)容個(gè)數(shù),就需要通過(guò)一些方法獲取到字符串的字節(jié)數(shù)。比如,限定10個(gè)字節(jié),則最多可以輸入10個(gè)英文字母,或者5個(gè)漢字。
監(jiān)聽(tīng)textField的長(zhǎng)度變化,就需要設(shè)置textField的代理。
但是有個(gè)bug,監(jiān)聽(tīng)內(nèi)容變化的代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
在點(diǎn)擊鍵盤(pán)輸入是正常的,但如果不點(diǎn)擊鍵盤(pán)按鍵,拿漢字輸入舉例,輸入一個(gè)字后,鍵盤(pán)上面會(huì)出現(xiàn)與該字可能是詞語(yǔ)的字,點(diǎn)上面出現(xiàn)的字來(lái)輸入,就不會(huì)觸發(fā)上面的代理方法。
所以這個(gè)代理方法不能用,我們需要通過(guò)注冊(cè)textField的通知來(lái)監(jiān)聽(tīng)。
//注冊(cè)通知,textfield內(nèi)容改變調(diào)用[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.testTextField];
實(shí)現(xiàn)通知方法
- (void)textFieldDidChange:(NSNotification *)note{UITextField *textField = note.object;//獲取文本框內(nèi)容的字節(jié)數(shù)int bytes = [self stringConvertToInt:self.testTextField.text];//設(shè)置不能超過(guò)32個(gè)字節(jié),因?yàn)椴荒苡邪雮€(gè)漢字,所以以字符串長(zhǎng)度為單位。if (bytes > 16){//超出字節(jié)數(shù),還是原來(lái)的內(nèi)容self.testTextField.text = self.lastTextContent;}else{self.lastTextContent = self.testTextField.text;}}//得到字節(jié)數(shù)函數(shù)- (int)stringConvertToInt:(NSString*)strtemp{ int strlength = 0; char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++){ if (*p) { p++; strlength++; } else { p++; }}return (strlength+1)/2;}如果textField一開(kāi)始就有內(nèi)容,就要獲取到,用代理方法
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{self.lastTextContent = textField.text;return YES;}以上是IOS之textField限制字節(jié)長(zhǎng)度的實(shí)現(xiàn)方法,希望能對(duì)您有所幫助,也希望大家繼續(xù)支持武林技術(shù)頻道!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注