[_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

之前写过一篇《如何更好地限制一个UITextField的输入长度》,在文章最后得到的结论是可以直接使用

  1. UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification;

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

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

 

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


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

这样处理后,我敲着键盘输入了若干个字符,当到达200个字符时就不会再输入了。但是当我从网页上复制一大堆中文内容(远超过200字),再粘贴到UITextView中,之后再尝试输入,则会挂掉:


  1. *** -[NSConcreteTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

我的解法是:


  1. - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
  2. {
  3. if (textView.text.length >= self.textLengthLimit && text.length > range.length) {
  4. return NO;
  5. }
  6. return YES;
  7. }

这样一来,当长度达到200以后,就不再响应输入变化了。

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


  1. *** Terminating app due to uncaught exception ‘NSRangeException‘, reason: ‘NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds‘

由于中文输入法的键盘上有联想、推荐的功能,所以可能导致文本内容长度上有些不符合预期,导致越界,所以可以参考这份回答做下处理:

    1. - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    2. {
    3. if (textView.text.length >= self.textLengthLimit && text.length > range.length) {
    4. return NO;
    5. }
    6. return YES;
    7. }
    8. - (void)textViewDidChange:(UITextView *)textView
    9. {
    10. self.placeholder.hidden = (self.textView.text.length > 0);
    11. if (textView.markedTextRange == nil && self.textLengthLimit > 0 && self.text.length > self.textLengthLimit) {
    12. textView.text = [textView.text substringToIndex:self.textLengthLimit];
    13. }
    14. }
时间: 2024-11-06 07:26:41

[_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds的相关文章

第二篇:_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

注意下文标红字段: #pragma mark- 输入改变时 - (void) textFieldDidChanged:(UITextField *) TextField{ //搜索关键字一旦改变,将重新搜索,防止下拉的时候数据重复 _currentPage = 1; bool isChinese;//判断当前输入法是否是中文 if ([[[UITextInputMode currentInputMode] primaryLanguage] isEqualToString: @"en-US&quo

【项目】'NSRangeException', reason: '*** -[__NSArrayM removeObjectAtIndex:]: index 2 beyond bounds [0 .. 1]'

问题代码: [self.assetsArray objectAtIndex:indexPath.row] 问题解决思路:这里 [项目]'NSRangeException', reason: '*** -[__NSArrayM removeObjectAtIndex:]: index 2 beyond bounds [0 .. 1]'

Terminating app due to uncaught exception 'NSRangeException', reason: -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

首页 > iOS问答 > 详情 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' *** First throw call stack: (0x1f9b012 0x1a90e7e 0x1f3d0b4 0x6baaf 0x1aa46b0 0x1c1bb

再谈multistage text input(中文输入法)下UITextView的内容长度限制

之前写过一篇<如何更好地限制一个UITextField的输入长度>,在文章最后得到的结论是可以直接使用 UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification; 进行监听,截断超出maxLength的部分. 所以后来我在处理UITextView的内容长度时,也直接参考这个方法: [[NSNotificationCenter defaultCenter] addObserver:self selector:@select

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

我以前写<如何更好地限制UITextField输入长度>.接使用 UIKIT_EXTERN NSString *const UITextFieldTextDidChangeNotification; 进行监听.截断超出maxLength的部分. 所以后来我在处理UITextView的内容长度时,也直接參考这种方法: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChang

iOS 计算label的高度

+ (CGFloat)labelHeight:(UILabel *)label lines:(NSInteger)lines { NSRange range = NSMakeRange(0, label.attributedText.length); NSDictionary *dic = [label.attributedText attributesAtIndex:0 effectiveRange:&range]; CGSize size = CGSizeMake(label.bounds.

小白学开发(iOS)OC_ 字符串的获取 (2015-08-11)

// //  main.m //  字符串的获取 // //  Created by admin on 15/8/13. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> /* 1. 获取字符串长度 2. 根据字符串索引获得单个字符    // 这里的索引 就是下标 3. 根据索引获得一个字符串 4. 根据子串获得子串在另一个字符串中的索引位置 5. 根据字符串,获得

字符串的获取

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //1.获取字符串的长度 NSString * str = @"abcd"; NSUInteger length = [str length]; //str.length; NSLog(@"字符串长度 %lu",length); //2.根据索引获得单个字符 NSSt

Foundation 基础类

NSString * str = @"adf"; NSString * str3 = [NSString stringWithFormat:@"%@,%@",@"a",@"b"]; char * c = "www";NSString * str4 = [[NSString alloc] initWithCString:c encoding:nil]; NSUInteger length =   [str l