6

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

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

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

我觉得我只是缺少一些设置。

4

2 回答 2

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]];
}

现在链接看起来像一个链接,但单击它实际上是一个按钮按下,您可以在 action 方法中检测到它并使用 NSWorkspace 进行调度。

于 2011-06-14T20:36:57.353 回答
0

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

在 NSTextField 和 NSTextView 中嵌入超链接

于 2011-02-23T05:34:41.780 回答