Технические вопросы и ответы QA1487

Встраивание гиперссылок в NSTextField и NSTextView

Q: Как я встраиваю гиперссылку в NSTextField или NSTextView?

A: Можно встроить гиперссылку с помощью NSAttributedString. Приписанная строка результанта будет содержать URL, стиль и цвет для дисплея.

Рисунок 1  иллюстрация в качестве примера NSTextField с гиперссылкой.

Расширение NSAttributedString

Простой способ к фактору это в Вашем приложении должно добавить «категорию» к классу NSAttributedString. Путем добавления дополнительного метода класса для этой категории Вы позволяете другим классам получать преимущества от этой расширенной функции.

Перечисление 1  , Добавляющее категорию к 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

Гиперссылка в NSTextField

Перечисление 2  , Создающее гиперссылку, приписало строку в 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];
}

Как Вы видите, setHyperlinkWithTextField: может находиться в Вашем классе, который можно вызвать от Вашего класса -awakeFromNib или NSDocument's -windowControllerDidLoadNib:, например.

Гиперссылка в NSTextView

Перечисление 3  , Создающее гиперссылку, приписало строку в 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];
}

Обратите внимание на то, что Перечисление 3 устанавливает приписанную строку немного по-другому для NSTextView. Необходимо установить текст с помощью NSTextStorage объект. NSTextStorage является подклассом NSAttributedString, который является запоминающим устройством для объекта NSTextView.



История версии документа


ДатаПримечания
05.01.2012

Удаленные утечки в двух фрагментах кода.

02.10.2006

Новый документ, показывающий, как приложение Какао может встроить гиперссылку и в использовании NSTextField и в NSTextView NSAttributedString.