• 谈论multistage text input(中国输入法)下一个UITextView内容长度的限制


    我以前写《如何更好地限制UITextField输入长度》。接使用
    UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;

    进行监听。截断超出maxLength的部分。

    所以后来我在处理UITextView的内容长度时,也直接參考这种方法:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChange:) name:UITextViewTextDidChangeNotification object:nil];

    - (void)textViewDidChange:(NSNotification *)notification
    {
        self.placeholder.hidden = (self.textView.text.length > 0);
        
        if (self.textLengthLimit > 0 && self.textView.text.length > self.textLengthLimit) {
            self.textView.text = [self.text substringToIndex:self.textLengthLimit];
        }
    }

    这样处理后,我敲着键盘输入了若干个字符,当到达200个字符时就不会再输入了。

    可是当我从网页上复制一大堆中文内容(远超过200字),再粘贴到UITextView中,之后再尝试输入,则会挂掉:

    *** -[NSConcreteTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds
    我的解法是:
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        if (textView.text.length >= self.textLengthLimit && text.length > range.length) {
            return NO;
        }
        
        return YES;
    }
    这样一来,当长度达到200以后,就不再响应输入变化了。

    只是,粘贴完达到200个字符后,能够退格删除。再使用中文输入法进行输入,这时候进入multistage text input模式(能够參考这里)。会触发另外的问题:

    *** Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds'
    因为中文输入法的键盘上有联想、推荐的功能。所以可能导致文本内容长度上有些不符合预期。导致越界,所以能够參考这份回答做下处理:
    - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        if (textView.text.length >= self.textLengthLimit && text.length > range.length) {
            return NO;
        }
        
        return YES;
    }
    
    - (void)textViewDidChange:(UITextView *)textView
    {
        self.placeholder.hidden = (self.textView.text.length > 0);
        
        if (textView.markedTextRange == nil && self.textLengthLimit > 0 && self.text.length > self.textLengthLimit) {
            textView.text = [textView.text substringToIndex:self.textLengthLimit];
        }
    }

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    MarkDown SequenceDiagram 语法
    mysql导出数据库文档
    使用gitlab作为go mod私服
    go context理解
    go-micro入门
    golang 接口测试
    小程序配置 app.json
    Nginx 配置详解(2)
    windows下安装nginx
    任意文件夹下打开命令提示窗
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4720490.html
Copyright © 2020-2023  润新知