有許多時候都有這種需求,那就是限制字數操作。
在沒有一套好的方法之前,比如textView的限制方法就是利用代理方法
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (textView.text.length >= number) {
textView.text = [textView.text substringToIndex:number];
return NO;
}else {
return YES;
}
}
可這種普遍的方式絕逼有問題,單純的英文還好說。可是你在使用拼音就會出現問題。那就是後面的時候你想輸入發現都輸入不上去。但是根據連鎖出來的詞語卻還能直接點上去。
所以,不能讓用戶連拼音都打不出來,就只能限制輸入成功之後的字數咯。
故,那就在每當text改變時去判斷字數就可以了。
textView 有代理方法 - (void)textViewDidChange:(UITextView *)textView可以實時的監聽text內容變化,而 textFiled 卻沒有,但是 @interface UITextField : UIControl <UITextInput, NSCoding>
所以可以添加監聽
[valueField addTarget:self action:@selector(changeText:) forControlEvents:UIControlEventEditingChanged];
所以不管是代理方法還是自己實現的監聽(textView代理實現大同小異),內容就可以去判斷字數了:
- (void)changeText:(UITextField *)sender
{
bool isChinese;//判斷當前輸入法是否是中文
if ([[[UITextInputMode currentInputMode] primaryLanguage] isEqualToString: @"en-US"]) {
isChinese = false;
}
else
{
isChinese = true;
}
NSInteger number = 0; //需要限制的字數
if (sender.tag == 30000) {
number = 5;
}else if (sender.tag == 30001)
{
number = 11;
}
if(sender.tag == 30000) {
// number位
NSString *str = [[sender text] stringByReplacingOccurrencesOfString:@"?" withString:@""];
if (isChinese) { //中文輸入法下
UITextRange *selectedRange = [sender markedTextRange];
//獲取高亮部分
UITextPosition *position = [sender positionFromPosition:selectedRange.start offset:0];
// 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
if (!position) {
NSLog(@"漢字");
if ( str.length>=number + 1) {
NSString *strNew = [NSString stringWithString:str];
[sender setText:[strNew substringToIndex:number]];
}
}
else
{
NSLog(@"輸入的英文還沒有轉化爲漢字的狀態");
}
}else{
NSLog(@"str=%@; 本次長度=%lu",str,(unsigned long)[str length]);
if ([str length]>=number + 1) {
NSString *strNew = [NSString stringWithString:str];
[sender setText:[strNew substringToIndex:number]];
}
}
}
}