要限制一個(gè)UITextField的輸入字?jǐn)?shù),首先我們應(yīng)該通過(guò)的是
UITextFieldDelegate 協(xié)議方法
的代理方法來(lái)限制:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
比如要設(shè)置限制字?jǐn)?shù)為20:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField == self.userNameTextField) {
if (textField.text.length > 20) return NO;
}
return YES;
}
但是這樣的限制簡(jiǎn)單粗暴手销,可能會(huì)影響用戶(hù)正常邏輯下的輸入,比如輸入了20個(gè)字符后,要退格回刪字符拒贱。
這時(shí)候我們可能會(huì)考慮“Detect backspace in UITextField”,比如簡(jiǎn)單地判斷replacementString的長(zhǎng)度是否為0佛嬉。
接著我們可能還會(huì)遇到用戶(hù)已經(jīng)輸入20個(gè)字符了逻澳,這時(shí)候繼續(xù)輸入---不過(guò)是選擇了部分文本進(jìn)行替換-----無(wú)法進(jìn)行了,這也妨礙了用戶(hù)的正常操作暖呕,所以限制的代碼版本可能會(huì)演進(jìn)為:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (textField == self.userNameTextField) {
if (string.length == 0)
return YES;
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.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ì)在鍵盤(pán)上方提供后續(xù)的一系列聯(lián)想詞瓤逼,你會(huì)發(fā)現(xiàn)通過(guò)這種方式可以連續(xù)選字輸入從而突破20個(gè)字符的限制笼吟。
到了這里,我們可能會(huì)希望有個(gè)類(lèi)似
- (void)textFieldDidChange:(UITextField *)textField;
的回調(diào)方法霸旗,但是沒(méi)有赞厕。
當(dāng)然,我們還可以通過(guò)
-(void)textFieldDidEndEditing:(UITextField *)textField
回調(diào)方法在結(jié)束編輯的時(shí)候把文本截?cái)喽ㄏ酰m然在用戶(hù)體驗(yàn)上會(huì)有點(diǎn)突兀皿桑。
不過(guò)當(dāng)我們點(diǎn)進(jìn)去UITextField.h頭文件里尋覓上述回調(diào)方法而不得時(shí),可能會(huì)發(fā)現(xiàn)最下面有這么個(gè)消息通知名稱(chēng):
UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;
不過(guò)蔬啡,監(jiān)聽(tīng)消息還要記得解除監(jiān)聽(tīng)诲侮,通常我還習(xí)慣把監(jiān)聽(tīng)消息的代碼統(tǒng)一放在一個(gè)方法中,看起來(lái)有點(diǎn)“大動(dòng)干戈”箱蟆。
所幸的是UITextField本身提供了相應(yīng)的事件監(jiān)聽(tīng):
[self.userNameTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
這樣就可以更好地限制輸入長(zhǎng)度:
-(void)textFieldDidChange:(UITextField *)textField{
if (textField == self.userNameTextField) {
if (textField.text.length > 20) {
textField.text = [textField.text substringToIndex:20];
}
}
}