NSTableView中NSTextFieldCell中的可点击网址链接?

时间:2009-04-19 08:05:47

标签: cocoa url nstableview nstextfield

我有一个我在NSTextFieldCell中使用的NSAttributedString。它会生成几个可点击的URL链接,并在NSTextFieldCell中放置一个大的NSAttributedString。每当我正常查看NSTextFieldCell并突出显示时,我都无法点击链接。

如果我设置TableView以便我可以编辑每个列或行,当我单击两次时,进入编辑模式并查看NSTextFieldCell内容,我的链接显示并且可以单击。当我点击该行时,我再也看不到可点击的链接。

我必须处于“编辑”模式才能看到链接或点击它们。

我觉得有一些设置我只是缺席了。

2 个答案:

答案 0 :(得分:1)

我不认为技术说明回答了问题,即如何在NSTableView单元格中放置链接。我发现这样做的最好方法是使用表格单元格的按钮单元格。这假设只有链接将在表的特定列中。

在Interface Builder中,将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进行调度。

答案 1 :(得分:0)

您是否看过Apple关于超链接的技术说明?

Embedding Hyperlinks in NSTextField and NSTextView