Embedding Hyperlinks in NSTextField and NSTextView
Q: How do I embed a hyperlink inside an NSTextField or NSTextView?
A: You can embed a hyperlink using an NSAttributedString. The resultant attributed string will contain the url, style and color for display.

Extending NSAttributedString
An easy way to factor this in your application is to add a "category" to the NSAttributedString class. By adding an additional class method to this category, you allow other classes to benefit from this extended feature.
Listing 1 Adding a category to NSAttributedString.
| @interface NSAttributedString (Hyperlink) | 
| +(id)hyperlinkFromString:(NSString*)inString withURL:(NSURL*)aURL; | 
| @end | 
| @implementation NSAttributedString (Hyperlink) | 
| +(id)hyperlinkFromString:(NSString*)inString withURL:(NSURL*)aURL | 
| { | 
| NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString: inString]; | 
| NSRange range = NSMakeRange(0, [attrString length]); | 
| [attrString beginEditing]; | 
| [attrString addAttribute:NSLinkAttributeName value:[aURL absoluteString] range:range]; | 
| // make the text appear in blue | 
| [attrString addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range]; | 
| // next make the text appear with an underline | 
| [attrString addAttribute: | 
| NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSSingleUnderlineStyle] range:range]; | 
| [attrString endEditing]; | 
| return [attrString autorelease]; | 
| } | 
| @end | 
Hyperlink in an NSTextField
Listing 2 Creating a hyperlink attributed string inside an NSTextField.
| -(void)setHyperlinkWithTextField:(NSTextField*)inTextField | 
| { | 
| // both are needed, otherwise hyperlink won't accept mousedown | 
| [inTextField setAllowsEditingTextAttributes: YES]; | 
| [inTextField setSelectable: YES]; | 
| NSURL* url = [NSURL URLWithString:@"http://www.apple.com"]; | 
| NSMutableAttributedString* string = [[NSMutableAttributedString alloc] init]; | 
| [string appendAttributedString: [NSAttributedString hyperlinkFromString:@"Apple Computer" withURL:url]]; | 
| // set the attributed string to the NSTextField | 
| [inTextField setAttributedStringValue: string]; | 
| [string release]; | 
| } | 
As you can see, setHyperlinkWithTextField: can reside in your class, which can be called from your class's -awakeFromNib or NSDocument's -windowControllerDidLoadNib:, for example.
Hyperlink in an NSTextView
Listing 3 Creating a hyperlink attributed string inside an NSTextView.
| -(void)setHyperlinkWithTextView:(NSTextView*)inTextView | 
| { | 
| // create the attributed string | 
| NSMutableAttributedString *string = [[NSMutableAttributedString alloc] init]; | 
| // create the url and use it for our attributed string | 
| NSURL* url = [NSURL URLWithString: @"http://www.apple.com"]; | 
| [string appendAttributedString:[NSAttributedString hyperlinkFromString:@"Apple Computer" withURL:url]]; | 
| // apply it to the NSTextView's text storage | 
| [[inTextView textStorage] setAttributedString: string]; | 
| [string release]; | 
| } | 
Note that Listing 3 sets the attributed string a little differently for NSTextView. You must set the text using the NSTextStorage object. NSTextStorage is a subclass of NSAttributedString that is the backing store for an NSTextView object.
Document Revision History
| Date | Notes | 
|---|---|
| 2012-01-05 | Removed leaks in two code snippets. | 
| 2006-10-02 | New document that shows how a Cocoa app can embed a hyperlink inside both NSTextField and NSTextView using NSAttributedString. | 
Copyright © 2012 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2012-01-05