要限制一個UITextField的輸入字數(shù)(參考鏈接)捏膨,首先想到的應(yīng)該是通過
UITextFieldDelegate
的代理方法來限制:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;//returnNO to not change text
比如要設(shè)置字數(shù)限制為20:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{if(textField == self.titleField) {if(textField.length > 20)returnNO;? ? }returnYES;}
但是這樣的限制簡單粗暴,可能會影響用戶正常邏輯下的輸入,比如輸入了20個字符后芥驳,要退格回刪字符半哟。
這時候我們可能會考慮“Detect backspace in UITextField”绘证,比如簡單地判斷replacementString的長度是否為0撵割。
接著我們可能還會遇到用戶已經(jīng)輸入20個字符了,這時候繼續(xù)輸入---不過是選擇了部分文本進行替換-----無法進行了跑杭,這也妨礙了用戶的正常操作铆帽,所以限制的代碼版本可能會演進為:
#pragma mark - UITextFieldDelegate- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{if(textField == self.titleField) {if(string.length == 0)returnYES;? ? ? ? NSInteger existedLength = textField.text.length;? ? ? ? NSInteger selectedLength = range.length;? ? ? ? NSInteger replaceLength = string.length;if(existedLength - selectedLength + replaceLength > 20) {returnNO;? ? ? ? }? ? }returnYES;}
到這里可能會覺得基本大功告成了,但是當你輸入19個字符后德谅,第20個字符以中文漢字的形式繼續(xù)輸入爹橱,那么系統(tǒng)會在鍵盤上方提供后續(xù)的一系列聯(lián)想詞,你會發(fā)現(xiàn)通過這種方式可以連續(xù)選字輸入從而突破20個字符的限制窄做。WTF
到了這里愧驱,我們可能會希望有個類似
- (void)textFieldDidChange:(UITextField *)textField
的回調(diào)方法,但可惜沒有椭盏。
當然组砚,我們還可以通過
- (void)textFieldDidEndEditing:(UITextField *)textField;
回調(diào)方法在結(jié)束編輯的時候把文本截斷,雖然在用戶體驗上會有點突兀掏颊。
不過當我們點進去UITextField.h頭文件里尋覓上述回調(diào)方法而不得時糟红,可能會發(fā)現(xiàn)最下面有這么個消息通知名稱:
UIKIT_EXTERN NSString *constUITextFieldTextDidChangeNotification;
不過,監(jiān)聽消息還要記得解除監(jiān)聽,通常我還習(xí)慣把監(jiān)聽消息的代碼統(tǒng)一放在一個方法中盆偿,看起來有點“大動干戈”掩蛤。
所幸的是UITextField本身提供了相應(yīng)的事件監(jiān)聽:
[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];? ? ? ? }? ? }}
轉(zhuǎn)載:http://blog.csdn.net/jasonblog/article/details/23771117