NSRange崩溃的应用程序

时间:2012-06-26 17:01:58

标签: ios xcode cocoa-touch ipad

我的NSRange存在问题,导致我的应用在textview为空时崩溃。我正在使用一个自定义键盘,上面有一个退格键,它在这里调用这段代码......

if ([self.myChart isFirstResponder]) {
    NSRange currentRange = myChart.selectedRange;
    if (currentRange.length == 0) {
        currentRange.location--;
        currentRange.length++;
    }
    myChart.text = [myChart.text stringByReplacingCharactersInRange:currentRange withString:[NSString string]];
    currentRange.length = 0;
    myChart.selectedRange = currentRange;

    NSLog(@"%d", NSNotFound);
}

如果我在textview中有文本,这对于一次删除一个字符非常有效,但是当我到达textview的开头并且没有其他字符时,我得到异常并崩溃......

*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'

我的目标是让退格功能停止。我明白为什么它会崩溃,但我不知道如何解决它。我试过没有运气对NSNotFound进行评估。

任何想法都会非常感激!

1 个答案:

答案 0 :(得分:4)

您应该检查字段中是否有文字,即:

if ( myChart.text.length > 0 )

并检查以确保您没有尝试访问位置-1:

if ( currentRange.location >= 0 )

所以你的代码看起来像

if ([self.myChart isFirstResponder] && myChart.text.length > 0 ) {
    NSRange currentRange = myChart.selectedRange;
    if (currentRange.length == 0) {
        currentRange.location--;
        currentRange.length++;
    }
    if ( currentRange.location >= 0 )
    {
        myChart.text = [myChart.text stringByReplacingCharactersInRange:currentRange withString:[NSString string]];
        currentRange.length = 0;
        myChart.selectedRange = currentRange;

        NSLog(@"%d", NSNotFound);
    }
}