2009-06-11 8 views
5

私はXCodeでMacアプリケーションを開発しています。私は、特定のサイトに移動するハイパーリンクを追加する必要があります。私はこれをボタンを使って試しましたが、マウスがそのボタンの上にあるときにカーソルをハンドカーソルに変更する方法を知る必要があります。Cocoaのハイパーリンク

答えて

8

私はあなたがURLを表示するために編集不可能なNSTextFieldを使うことができると信じています。フィールドのvalueプロパティとして設定したNSAttributedStringに適切に属性を設定すると、標準の青色の下線として表示され、カーソル追跡が処理されます。 This Apple Q & Aは、URLの属性を設定する方法を示します。

+0

このAppleのテクニカルノートの唯一の問題は、マウスカーソルがI-beamテキスト入力スタイルのカーソルにマウスオーバーしても変わるということです。 –

+0

もう一つの問題は、リンクをクリックすると、NSTextFieldのフォントがシステムのデフォルトに変更されることです。以下は、テキストフィールドのフォントを継承するようにテキストを強制することで、私の不具合を修正します: '[attString addAttribute:NSFontAttributeName value:[label font] range:NSMakeRange(0、[attString length])];' –

4

カーソルを設定するには、カーソル追跡方法addCursorRect:cursor:を使用する必要があります。しかし、あなたは実際にはresetCursorRectsメソッドの中からそのメソッドを呼び出すことになっています。それ以外の場合は、基本的に無視されることが保証されています。

だから、これはあなたがNSButton(または任意NSViewサブクラス使用したい)をサブクラス化して、ビュー全体のboundsためaddCursorRect:cursor:を呼び出すためにresetCursorRectsを上書きする必要があるということです。

+0

は、完全に私のためのおかげで勤務しました。私はNSTextFieldをサブクラス化しました。 –

2

私はこれを次の誰かのために更新された答えに投げたいと思います。

Apple Q & Aで指定されたソリューションをBarryの答えで試したところ、クリックしたときにラベルリンクのテキストが縮小することがわかりました。いくつかのデバッグの後、アップルの記事のサンプルコードが新しい属性付き文字列を設定していたが、ラベルコントロールの元の属性をそのまま残していないことがわかった。解決方法は、ラベルの元の属性付き文字列のコピーから開始し、新しいハイパーリンクプロパティを追加し、ラベルを更新することです。

NSTextFieldラベルをハイパーリンクに変換する簡単なヘルパー関数を作成しました。基本的には、NSAttributeStringにカテゴリ拡張機能を追加する必要なく、Appleのページにソリューションを統合します。

// Converts an otherwise plain NSTextField label into a hyperlink 
-(void)updateControl:(NSTextField*)control withHyperlink:(NSString*)strURL 
{ 
    // both are needed, otherwise hyperlink won't accept mousedown 
    [control setAllowsEditingTextAttributes: YES]; 
    [control setSelectable: YES]; 

    NSURL* url = [NSURL URLWithString:strURL]; 

    NSAttributedString* attrString = [control attributedStringValue]; 

    NSMutableAttributedString* attr = [[NSMutableAttributedString alloc] initWithAttributedString:attrString]; 
    NSRange range = NSMakeRange(0, [attr length]); 

    [attr addAttribute:NSLinkAttributeName value:url range:range]; 
    [attr addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range ]; 
    [attr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range]; 

    [control setAttributedStringValue:attr]; 
} 

そして、それを起動し、ウィンドウが初期化さいつか時にNSTextFieldとURL文字列を渡す:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    [self updateControl:_label withHyperlink:@"http://www.stackoverflow.com"]; 

} 
関連する問題