9

OK、これが私が欲しいものです:

  • 私たちはNSTextView
  • カーソル位置で「現在の」単語を(NSRange?として)取得します(これはどのように決定できますか?)
  • それを強調表示します(その属性を変更します)

これについてどうすればよいかわかりません:私の主な関心事は、現在の位置NSTextViewを取得し、その時点で単語を取得することです(一部のテキストプラグインがそれをサポートしていることは知っていますが、元の実装の時点ではわかりません... NSTextView)。

そのための組み込み関数はありますか?または、そうでない場合は、何かアイデアはありますか?


更新: カーソル位置(解決済み)

NSInteger insertionPoint = [[[myTextView selectedRanges] objectAtIndex:0] rangeValue].location;

今でも、基になる単語を指定するための回避策を見つけようとしています...

4

2 に答える 2

8

これが1つの方法です:

NSUInteger insertionPoint = [myTextView selectedRange].location;
NSString *string = [myTextView string];

[string enumerateSubstringsInRange:(NSRange){ 0, [string length] } options:NSStringEnumerationByWords usingBlock:^(NSString *word, NSRange wordRange, NSRange enclosingRange, BOOL *stop) {
if (NSLocationInRange(insertionPoint, wordRange)) {
    NSTextStorage *textStorage = [myTextView textStorage];
    NSDictionary *attributes = @{ NSForegroundColorAttributeName: [NSColor redColor] }; // e.g.
    [textStorage addAttributes:attributes range:wordRange];
    *stop = YES;
}}];
于 2012-09-23T18:26:56.293 に答える
1

単語の境界を見つけるための単純なアルゴリズム(単語がスペーススピアリングされていると仮定):

NSInteger prev = insertionPoint;
NSInteger next = insertionPoint;

while([[[myTextView textStorage] string] characterAtIndex:prev] != ' ')
    prev--;

prev++;

while([[[myTextView textStorage] string] characterAtIndex:next] != ' ')
    next++;

next--;

NSRange currentWordRange = NSMakeRange(prev, next - prev + 1);
NSString *currentWord = [[[myTextView textStorage] string] substringWithRange:currentWordRange];
于 2012-09-23T18:26:19.960 に答える