Интерактивная URL-ссылка в NSTextFieldCell внутри NSTableView?

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

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

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

Я чувствую, что есть какая-то настройка, которую мне просто не хватает.


person Community    schedule 19.04.2009    source источник


Ответы (2)


Я не думаю, что техническая заметка отвечает на вопрос, как поместить ссылку в ячейку 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.

person Chris Mason    schedule 14.06.2011

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

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

person sosborn    schedule 23.02.2011
comment
Ссылка не работает. - person Parag Bafna; 03.04.2021