要限制一個(gè)UITextField的輸入字?jǐn)?shù),通過(guò)UITextFieldDelegate方法來(lái)限制
// return NO to not change text
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
比如要設(shè)置字?jǐn)?shù)限制為20:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.titleField) {
if (textField.length > 20) return NO;
}
return YES;
}
但是這樣的限制簡(jiǎn)單粗暴编矾,可能會(huì)影響用戶正常邏輯下的輸入说订,比如輸入了20個(gè)字符后,要退格回刪字符。如果只是這樣限制會(huì)導(dǎo)致用戶無(wú)法刪除字符,需要加上判斷條件:
// 刪除一個(gè)字符時(shí)原献,string.length == 0,string == @""
// 輸入時(shí)音婶,string.length才有值
if (string.length == 0) return YES;// return YES 確保能夠刪除字符
可能還會(huì)遇到用戶已經(jīng)輸入20個(gè)字符了,這時(shí)候繼續(xù)輸入莱坎,UITextFiled已經(jīng)無(wú)法響應(yīng)用戶的輸入了衣式,這也妨礙了用戶的正常操作。限制的代碼可能會(huì)演進(jìn)為:
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSLog(@"range:%@", NSStringFromRange(range));
NSLog(@"string:%@--length:%zd", string, [string length]);
NSLog(@"textField.text.length:%zd", textField.text.length);
NSLog(@"self.textField.text.length:%zd", self.textField.text.length);
if (textField == self.textField) {
// 刪除一個(gè)字符時(shí)檐什,string.length == 0碴卧,string == @""
// 輸入時(shí),string.length才有值
if (string.length == 0) return YES;// return YES 確保能夠刪除字符
// 輸入時(shí):總長(zhǎng)度不包括本次輸入的字符長(zhǎng)度乃正,總長(zhǎng)度為之前輸入的總的字符串長(zhǎng)度(顯示出來(lái)的才算)
// 刪除字符時(shí):總長(zhǎng)度為刪除的字符長(zhǎng)度+剩下的字符長(zhǎng)度住册,也就是沒(méi)刪除前textField顯示的總長(zhǎng)度
NSInteger existedLength = textField.text.length;
// 刪除字符時(shí), range.length才不為0,為刪除的字符個(gè)數(shù)
// 輸入字符狀態(tài),那么range.length == 0
NSInteger selectedLength = range.length;
// 輸入時(shí)烫葬,string.length才有值,輸入中文時(shí)不調(diào)用這個(gè)代理方法界弧,就得不到string.length的值
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > 20) {
return NO;
}
}
return YES;
}
到這里可能會(huì)覺(jué)得基本大功告成了,但是當(dāng)你輸入19個(gè)字符后搭综,第20個(gè)字符以中文漢字的形式繼續(xù)輸入,那么系統(tǒng)會(huì)在鍵盤上方提供后續(xù)的一系列聯(lián)想詞划栓,你會(huì)發(fā)現(xiàn)通過(guò)這種方式可以連續(xù)選字輸入從而突破20個(gè)字符的限制,我們可能會(huì)希望有個(gè)類似UITextView的方法,但事實(shí)是沒(méi)有的兑巾,但是有一個(gè)通知可以監(jiān)聽(tīng)到UITextField輸入文字的改變
// 自定義的
- (void)textFieldDidChange:(UITextField *)textField
UITextField文字發(fā)生改變通知
UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;
監(jiān)聽(tīng)通知,這樣就可以更好地限制輸入長(zhǎng)度:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
- (void)textFieldDidChange:(UITextField *)textField
{
if (textField == self.titleField) {
if (textField.text.length > 20) {
textField.text = [textField.text substringToIndex:20];
}
}
}