需求是这样的:
在输入框内输入文字,字数在40字以内,并实时统计反馈给用户。
我使用了UITextView并实现了委托:
- (void)textViewDidChange:(UITextView *)textView
{
[self checkText:textView];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
retrun [self checkText:textView];
}
- (BOOL)checkText:(UITextView *)textView
{
NSString *text = textView.text;
if (text.length > kMaxLength)
{
textView.text = [text substringToIndex:kMaxLength];
return NO;
}
return YES;
}
分别试了下两个委托,实现的效果都不太好,会出现中文无限输入,备选框中的文字无法被选择的情况。
重新修改了委托:
- (void)textViewDidChange:(UITextView *)textView
{
NSString *lang = [[[UITextInputMode activeInputModes] firstObject] primaryLanguage];//当前的输入模式
if ([lang isEqualToString:@"zh-Hans"])
{
// 如果输入有中文,且没有出现文字备选框就对字数统计和限制
// 出现了备选框就暂不统计
UITextRange *range = [textView markedTextRange];
UITextPosition *position = [textView positionFromPosition:range.start offset:0];
if (!position)
{
[self checkText:textView];
}
}
else
{
[self checkText:textView];
}
}
- (void)checkText:(UITextView *)textView
{
NSString *string = textView.text;
if (string.length > kMaxLength)
{
textView.text = [string substringToIndex:kMaxLength];
}
NSInteger length = textView.text.length;
NSInteger num = kMaxLength - length;
num = MAX(num, 0);
[self.wordLabel setText:[NSString stringWithFormat:@"还可以输入%d字",(int)num]];
[self.placeholderLabel setHidden:textView.text.length == 0 ? NO : YES];
}