1

初めての Mac アプリであるテキスト エディターを作成しています。これはドキュメントベースであり、Document.xib には nstextview があります。Document クラスをテキストビューのデリゲートにしました。私はメソッドを実装しています:

-(void)textViewDidChangeSelection:(NSNotification *)notification
{
NSRange range=self.textView.selectedRange;
NSLog(@" %@ ",[[self.textView textStorage] attributesAtIndex: range.location
                                              effectiveRange: &range]); 

NSLog 内にあるメソッド呼び出しを使用して、選択したテキストの属性を取得し、その通知メソッドから下線ボタン (押されているかどうか) を更新します。問題は、アプリの実行中にキーを押すと例外が発生することです: キャッチされていない例外が発生しました

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

@try: @catch: ブロックでデバッグしてみましたが、上記のメソッドは常にその例外をスローするようです。私が交換した場合:

range.location

(range.location-1)

カーソルがインデックス 0 にある場合にのみ、その例外がスローされます。

誰が何が起こっているのか知っていますか?

4

2 に答える 2

0

effectiveRangeは、メソッドが属性をスキャンする範囲を決定するために使用する範囲ではありません。これは、返されたときに、属性と値がインデックス attributeAtIndex の値と同じである範囲を含む範囲です (つまり、メソッドは範囲変数に異なる値を割り当てます)。

メソッドが属性を検索するために使用する範囲を選択した範囲に制限する場合は、次のメソッドを rangeLimit を選択した範囲に設定して使用します。

(NSDictionary *)attributesAtIndex:(NSUInteger)index longestEffectiveRange:(NSRangePointer)aRange inRange:(NSRange)rangeLimit

-(void)textViewDidChangeSelection:(NSNotification *)notification
{
    NSRange selectedRange=self.textView.selectedRange;
    NSRange effectiveRange;
    if(selectedRange.length > 0) {
        NSLog(@" %@ ",[[self.textView textStorage] attributesAtIndex:selectedRange.location
       longestEffectiveRange:&effectiveRange inRange:selectedRange]); 
    }
}

selectedRange の長さが 0 の場合、このメソッドは機能しないようです。これが、selectedRange.length が呼び出される前にチェックされる理由です。

于 2013-07-31T11:45:46.330 に答える
0

このスレッドにはしばらく時間がかかりましたが、とにかく私はこれを見つけました。

呼び出し - attributesAtIndex: range.length == 0 の場合は問題なく動作しますが、場所が文字列の末尾にある場合は失敗します。範囲 {string_length, 0} は有効な範囲であるため、これは明らかにバグです。

これを克服するために、現在の入力スタイルの属性を提供する -typingAttributes: を使用します。

NSRange currange = [self.textViewEditor selectedRange];
NSLog(@"range %@", NSStringFromRange(currange));
NSDictionary *dict;
if (currange.length==0)
    dict = [self.textViewEditor typingAttributes];
else
    dict = [self.textViewEditor.textStorage attributesAtIndex:currange.location effectiveRange:&range];
于 2014-01-23T20:57:26.353 に答える