要限制一個(gè)UITextField的輸入字?jǐn)?shù)惭蟋,很多人首先想到的是通過(guò)UITextFieldDelegate下面這個(gè)代理方法實(shí)現(xiàn):
```
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string;//return NO to not change text
例如要設(shè)置字?jǐn)?shù)限制為10:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
? ? if (textField == self.titleField) {
if (textField.length >=10) return NO;
? ? }
? ? return YES;
}
```
此列的缺點(diǎn):
1达罗、此時(shí)要添加到textField的文字并未寫入textField榜苫,我們判斷的是已經(jīng)輸入的文字是否超過(guò)10個(gè)断医,如果輸入了9個(gè),然而最后一次直接拼音出來(lái)好幾個(gè)字蔬捷,此時(shí)也是可以輸入的蓄坏,所以range和string參數(shù)是一定要使用的,range說(shuō)明文字要插入的文字將要放置的位置枫慷,string為將要插入的字符串让蕾。
2、聯(lián)想詞的輸入不通知此代理函數(shù)或听,所以如果通過(guò)聯(lián)想詞輸入的話探孝,想輸入多少文字都可以
3、輸入超過(guò)10個(gè)字之后退格鍵不能用
4誉裆、當(dāng)使用拼音輸入法時(shí)顿颅,該委托方法中的最后一個(gè)參數(shù)string接受的是輸入的字母,而不是選擇的漢字足丢,造成的結(jié)果是粱腻,當(dāng)想輸入文字“我在編程”,輸入拼音“wozaibiancheng”霎桅,每輸入一個(gè)字母便會(huì)進(jìn)入委托方法栖疑,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度滔驶,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入遇革。而且,致命的是揭糕,這個(gè)委托方法并不響應(yīng)萝快,選中候選漢字的過(guò)程即這個(gè)委托方法沒(méi)有響應(yīng)最后拼音到漢字的過(guò)程),這就沒(méi)有辦法重新修正字符長(zhǎng)度的統(tǒng)計(jì)了著角。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
? ? if (textField == self.titleField) {
? ? ? ? if (string.length == 0) return YES;
? ? ? ?NSMutableString *newtxt = [NSMutableString stringWithString:textField.text];
? ? ? ? [newtxt replaceCharactersInRange:range withString:string];
? ? ? ? if (newtxt.length > 10) return NO;
? ? }
? ? return YES;
}
此列的缺點(diǎn):
1揪漩、聯(lián)想詞的輸入不通知此代理函數(shù),所以如果通過(guò)聯(lián)想詞輸入的話吏口,想輸入多少文字都可以
2奄容、輸入超過(guò)10個(gè)字之后退格鍵不能用
3、當(dāng)使用拼音輸入法時(shí)产徊,該委托方法中的最后一個(gè)參數(shù)string接受的是輸入的字母昂勒,而不是選擇的漢字,造成的結(jié)果是舟铜,當(dāng)想輸入文字“我在編程”戈盈,輸入拼音“wozaibiancheng”,每輸入一個(gè)字母便會(huì)進(jìn)入委托方法,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度塘娶,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度归斤,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入。而且刁岸,致命的是脏里,這個(gè)委托方法并不響應(yīng),選中候選漢字的過(guò)程(即這個(gè)委托方法沒(méi)有響應(yīng)最后拼音到漢字的過(guò)程)虹曙,這就沒(méi)有辦法重新修正字符長(zhǎng)度的統(tǒng)計(jì)了膝宁。
對(duì)于聯(lián)想詞的問(wèn)題,我們還可以通過(guò)-(void)textFieldDidEndEditing:(UITextField *)textField;代理方法在結(jié)束編輯的時(shí)候把文本截?cái)喔酰怯脩趔w驗(yàn)很差,因?yàn)橛脩魰?huì)看到輸入的文字在輸入完成時(shí)突然少了幾個(gè)合蔽。此時(shí)希望有類似-(void)textFieldDidChange:(UITextField *)textField的代理方法击敌,但可惜沒(méi)有。不過(guò)天無(wú)絕人之路拴事,UITextField有UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification這個(gè)消息通知(切記沃斤,監(jiān)聽(tīng)消息還要記得解除監(jiān)聽(tīng)),UITextField本身提供了相應(yīng)的事件監(jiān)聽(tīng):
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
這樣就可以更好地限制輸入長(zhǎng)度:
- (void)textFieldDidChange:(UITextField *)textField
{
? ? if (textField == self.titleField) {
? ? ? ? if (textField.text.length > 10) {
? ? ? ? ? ? textField.text = [textField.text substringToIndex:10];
? ? ? ? }
? ? }
}
此列的缺點(diǎn):
1刃宵、對(duì)于純字符的統(tǒng)計(jì)沒(méi)有什么問(wèn)題衡瓶,但是,當(dāng)使用拼音輸入法時(shí)牲证,該方法中的最后一個(gè)參數(shù)string接受的是輸入的字母哮针,而不是選擇的漢字,造成的結(jié)果是坦袍,當(dāng)想輸入文字“我在編程”十厢,輸入拼音“wozaibiancheng”,每輸入一個(gè)字母便會(huì)進(jìn)入方法捂齐,統(tǒng)計(jì)的字符長(zhǎng)度是字母的長(zhǎng)度蛮放,實(shí)際上漢字還未超過(guò)限制長(zhǎng)度,但是字母的長(zhǎng)度超過(guò)了導(dǎo)致無(wú)法繼續(xù)輸入奠宜。
解決辦法如下:
- (void) textFieldDidChange:(UITextField *)textField
{
? ? NSInteger kMaxLength = 8;
? ? NSString *toBeString = textField.text;
? ? NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; //ios7之前使用[UITextInputMode currentInputMode].primaryLanguage
? ? if ([lang isEqualToString:@"zh-Hans"]) { //中文輸入
? ? ? ? UITextRange *selectedRange = [textField markedTextRange];
? ? ? ? //獲取高亮部分
? ? ? ? UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
? ? ? ? if (!position) {// 沒(méi)有高亮選擇的字包颁,則對(duì)已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計(jì)和限制
? ? ? ? ? ? if (toBeString.length > kMaxLength) {
? ? ? ? ? ? ? ? textField.text = [toBeString substringToIndex:kMaxLength];
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else{//有高亮選擇的字符串,則暫不對(duì)文字進(jìn)行統(tǒng)計(jì)和限制
? ? ? ? }
? ? }else{//中文輸入法以外的直接對(duì)其統(tǒng)計(jì)限制即可压真,不考慮其他語(yǔ)種情況
? ? ? ? if (toBeString.length > kMaxLength) {
? ? ? ? ? ? textField.text = [toBeString substringToIndex:kMaxLength];
? ? ? ? }
? ? }
}