UITextView字数限制

经常做,经常忘,记下来,以后好直接拷贝。

开始使用如下方法做限制

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    if ([text isEqualToString:@""] && range.length > 0) {
        //删除字符肯定是安全的
        return YES;
    }
    else {
        if (textView.text.length - range.length + text.length > 300) {
            [FXAlertTool alertWithMessage:@"超出字数限制" target:self];
            return NO;
        }
        else {
            return YES;
        }
    }
}

问题是使用中文输入法,最后一个字不能输入,总是提示超出字数限制,因为输入拼音的时候就开始计算文本长度。所以做了优化,以下方法可以直接拷贝粘贴使用。注意:没有处理表情!

- (void)textViewDidChange:(UITextView *)textView {
    int maxLimit = 300;
    NSString *lang = [[textView textInputMode] primaryLanguage]; // 键盘输入模式
    if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
        UITextRange *selectedRange = [textView markedTextRange];
        //获取高亮部分
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
        // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
        if (!position) {
            if (textView.text.length > maxLimit) {
                textView.text = [textView.text substringToIndex:maxLimit];
                [FXAlertTool alertWithMessage:@"超出字数限制" target:self];
            }
        } else {
            // 有高亮选择的字符串,则暂不对文字进行统计和限制
        }
    } else { // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
        if (textView.text.length > maxLimit) {
            textView.text = [textView.text substringToIndex:maxLimit];
            [FXAlertTool alertWithMessage:@"超出字数限制" target:self];
        }
    }
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    int maxLimit = 300;
    if ([self isText:textView beyondLimit:maxLimit] && [text length] > 0) {
        return NO;
    }
    return YES;
}

- (BOOL)isText:(UITextView *)tv beyondLimit:(int)maxLimit{
    NSString *lang = [[tv textInputMode] primaryLanguage];
    if ([lang isEqualToString:@"zh-Hans"]) {
        UITextRange *selectedRange = [tv markedTextRange];
        UITextPosition *position = [tv positionFromPosition:selectedRange.start offset:0];
        if (!position) {
            if (tv.text.length > maxLimit) {
                return YES;
            }
        }
    } else {
        if (tv.text.length > maxLimit) {
            return YES;
        }
    }
    
    return NO;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哈雷彗星撞地球

iOS 中如何判断当前是2G/3G/4G/5G/WiFi

5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了。 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如...

1692
来自专栏王大锤

UITextView字数限制

45110
来自专栏iOS122-移动混合开发研究院

RDVTabBarController--可自由定制的iOS底部导航控件

RDVTabBarController:一个十分完善的tabBarController,可以自定义角标个数,爽的停不下来。 RDVTabBarControlle...

21510
来自专栏向治洪

RCTEventEmitter使用

在0.27版本之前,RN的Native端向js端发射消息主要通过sendDeviceEventWithName的方式,相关代码如下。 @synthesize b...

3487
来自专栏DannyHoo的专栏

第三方库AF之Post

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

861
来自专栏雨尘分享

ReactiveCocoa 入门知识——归总篇

2194
来自专栏猿人谷

ios 开发,通讯录信息调用常用方法,这个比较全,不用再整理了

ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ...

2217
来自专栏.NET开发那点事

关于Form.Close跟Form.Dispose

我们在Winform开发的时候,使用From.Show来显示窗口,使用Form.Close来关闭窗口。熟悉Winform开发的想必对这些非常熟悉。但是Form类...

2156
来自专栏iOS开发攻城狮的集散地

iOS 仿系统指南针

2135
来自专栏Python疯子

iOS 单选按钮组--只能而且必选一个按钮

2、初始化并默认一个选项,这里用了4个button,实际可以采用2个,因为写一半才发现后面的汉字也要设置成可点的,就懒得改了,直接改成button了

3312

扫码关注云+社区

领取腾讯云代金券