2009-04-19 4 views
6

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

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

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

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

ответ

1

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

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

В табличном виде делегата, осуществлять Tableview: dataCellForTableColumn: строка: следующий образом:

- (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.