0

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);
}

テキストビューにテキストがある場合、これは一度に1文字を削除するのに完全に機能しますが、テキストビューの先頭に到達して文字がなくなると、例外が発生してクラッシュします...

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

私の目標は、バックスペース機能を停止させることです。クラッシュする理由はわかりますが、解決方法がわかりません。運が悪かったので、NSNotFoundに対して評価してみました。

どんなアイデアでも大歓迎です!

4

1 に答える 1

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);
    }
}
于 2012-06-26T17:05:04.657 に答える