1

NSTExtView使用して、特定の範囲のテキストの属性を設定しています[theTextView.textStorage addAttribute: value: range:]

たとえば、私はを使用して範囲を強調表示します[theTextView.textStorage addAttribute:NSBackgroundColorAttributeName value:[NSColor yellowColor] range:theSelectedRange];

問題は、その範囲に新しいテキストを手動で入力しても、強調表示されないことです。ハイライトされた範囲を2つの範囲に分割し、ハイライトされていないテキストをそれらの間に挿入します。新しく挿入されたテキストも強調表示する方法はありますか?

4

1 に答える 1

1

ユーザーが NSTextView に何か新しいものを入力すると、挿入ポイントは現在のフォントに関連付けられている属性 (存在する場合) を使用します。これは、テキスト ビューの「typingAttributes」とも呼ばれます。ほとんどの場合、ユーザーは黒と白の背景で入力します。

ここで強調表示している (選択を行っていない) ため、カーソルの挿入ポイントで現在の色を取得する必要があります。

次の方法で属性をフェッチすることでそれを行うことができます。

// I think... but am not 100% certain... the selected range
// is the same as the insertion point.
NSArray * selectedRanges = [theTextView selectedranges];
if(selectedRanges && ([selectedRanges count] > 0))
{
    NSValue * firstSelectionRangeValue = [selectedRanges objectAtIndex: 0];
    if(firstSelectionRangeValue)
    {
        NSRange firstCharacterOfSelectedRange = [firstSelectionRangeValue rangeValue];

        // now that we know where the insertion point is likely to be, let's get
        // the attributes of our text
        NSSDictionary * attributesDictionary = [theTextView.textStorage attributesAtIndex: firstCharacterOfSelectedRange.location effectiveRange: NULL];

        // set these attributes to what is being typed
        [theTextView setTypingAttributes: attributesDictionary];

        // DON'T FORGET to reset these attributes when your selection changes, otherwise
        // your highlighting will appear anywhere and everywhere the user types.
    }
}

このコードをまったくテストしたり試したりしたことはありませんが、これで必要な場所にたどり着くはずです。

于 2012-08-09T21:09:10.347 に答える