Кликабельная ссылка в NSTextFieldCell внутри NSTableView? - PullRequest
6 голосов
/ 19 апреля 2009

У меня есть NSAttributedString, которую я использую в NSTextFieldCell. Он создает несколько кликабельных URL-ссылок и помещает большую строку NSAttributedString в NSTextFieldCell. Всякий раз, когда я нормально просматриваю NSTextFieldCell и он подсвечивается, я не могу нажимать на ссылки.

Если я установлю TableView так, чтобы я мог редактировать каждый столбец или строку, когда я дважды щелкну, перейду в режим редактирования и просмотрите содержимое NSTextFieldCell, мои ссылки появятся и будут доступны для нажатия. Когда я щелкаю по строке, я больше не вижу кликабельных ссылок.

Я должен быть в режиме «редактирования», чтобы увидеть ссылки или щелкнуть по ним.

Я чувствую, что есть некоторые настройки, которые я просто пропускаю.

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Я не думаю, что техническая заметка отвечает на вопрос о том, как поместить ссылку в ячейку NSTableView. Лучший способ сделать это - использовать ячейку кнопки для ячейки таблицы. Предполагается, что в конкретном столбце таблицы будут только ссылки.

В Интерфейсном Разработчике перетащите ячейку NSButton в столбец таблицы, где вы хотите ссылки.

В делегате табличного представления реализуйте tableView: dataCellForTableColumn: row: следующим образом:

- (NSCell *) tableView: (NSTableView *) tableView
    dataCellForTableColumn: (NSTableColumn *) column
    row: (NSInteger) row
{
    NSButtonCell *buttonCell = nil;
    NSAttributedString *title = nil;
    NSString *link = nil;
    NSDictionary *attributes = nil;

// Cell for entire row -- we don't do headers
    if (column == nil)
        return(nil);

// Columns other than link do the normal thing
    if (![self isLinkColumn:column]) // Implement this as appropriate for your table
        return([column dataCellForRow:row]);

// If no link, no button, just a blank text field
    if ((link = [self linkForRow:row]) != nil) // Implement this as appropriate for your table
        return([[[NSTextFieldCell alloc] initTextCell:@""] autorelease]);

// It's a link. Create the title
    attributes = [[NSDictionary alloc] initWithObjectsAndKeys:
        [NSFont systemFontOfSize:[NSFont systemFontSize]], NSFontAttributeName,
        [NSNumber numberWithInt:NSUnderlineStyleSingle], NSUnderlineStyleAttributeName,
        [NSColor blueColor], NSForegroundColorAttributeName,
        [NSURL URLWithString:link], NSLinkAttributeName, nil];
    title = [[NSAttributedString alloc] initWithString:link attributes:attributes];
    [attributes release];

// Create a button cell
    buttonCell = [[[NSButtonCell alloc] init] autorelease];
    [buttonCell setBezelStyle:NSRoundedBezelStyle];
    [buttonCell setButtonType:NSMomentaryPushInButton];
    [buttonCell setBordered:NO]; // Don't want a bordered button
    [buttonCell setAttributedTitle:title];
    [title release];
    return(buttonCell);
}

Задайте цель / действие для таблицы вашему делегату и проверьте наличие кликов в столбце ссылок:

- (void) clickTable: (NSTableView *) sender
{
    NSTableColumn *column = [[sender tableColumns] objectAtIndex:[sender clickedColumn]];
    NSInteger row = [sender clickedRow];
    NSString *link = nil;

    if ([self isLinkColumn:column] && (link = [self linkForRow:row]) != nil)
        [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:link]];
}

Теперь ссылка выглядит как ссылка, но щелчок по ней - это фактически нажатие кнопки, которое вы обнаруживаете в методе действия и отправляете с помощью NSWorkspace.

0 голосов
/ 23 февраля 2011

Вы видели эту техническую заметку от Apple относительно гиперссылок?

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

...