NSTextViewにクリックできるリンクを追加する

Cocoaに関するヌマタメモ
2008年11月29日 22:24

注:このメモは古くなっている可能性大

参考資料のリンクからサンプルプロジェクトをダウンロードし、

  • NSTextViewWithLinks.h
  • NSTextViewWithLinks.m
  • fingerCursor.tiff

をプロジェクトに追加する。Safari などと動作を同じにするためには、NSTextViewWithLinks.m 34行目の「NSMakePoint (0, 0)」を「NSMakePoint (5, 0)」にする。

次に、以下のテキスト属性でリンクとする NSAttributedString を作成してテキストビューに追加する。@"Link Parameter" の部分には、任意の文字列を指定することができる(別に文字列でなくても、nil ではない有効なオブジェクトを指定できるんじゃないだろうか)。

NSMutableDictionary *linkAttributes = [NSMutableDictionary dictionaryWithCapacity:3];
[linkAttributes setObject:@"Link Parameter" forKey:NSLinkAttributeName];
[linkAttributes setObject:[NSColor blueColor] forKey:NSForegroundColorAttributeName];
[linkAttributes setObject:[NSNumber numberWithBool:YES] forKey:NSUnderlineStyleAttributeName];

NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:
                               @"This is the link." attributes:linkAttributes];

[textView textStorage appendAttributedString:attrStr];

その後、リンクの位置が追加/変更されたことを、テキストビューに知らせてやる。

[[textView window] resetCursorRects]; 

これでリンクの上でマウスカーソルが変更され、リンクがリンクとして扱われるようになる。

クリックを受け取るのは、テキストビューの delegate である。リンクがクリックされる度に、

- (BOOL)textView:(NSTextView *)textView clickedOnLink:(id)link atIndex:(unsigned)charIndex;

がコールされる。上で @"Link Parameter" に設定した文字列は、

NSDictionary *dict = [textView textStorage attributesAtIndex:charIndex effectiveRange:nil];
if (dict) {
    NSString *parameterStr = (NSString *) dict objectForKey:NSLinkAttributeName;
}

として取得することができる。

英辞郎ビューアの以前のバージョンではリンクの場所を記憶させた上でクリックされた場所を取得して処理していたが、こうしてパラメータを含んだリンクとして処理することで、そのような煩わしい処理が不必要になる。

参考資料

コメントを書く


トラックバックはありません。

トラックバックURL: http://numata.designed.jp/mt-tb.cgi/39