首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

关于UITextView输入中文

2024-12-20 来源:化拓教育网

需求是这样的:

在输入框内输入文字,字数在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];
}
显示全文