6

NSTextFieldCell で使用している NSAttributedString があります。いくつかのクリック可能な URL リンクを作成し、NSTextFieldCell 内に大きな NSAttributedString を配置します。NSTextFieldCell を正常に表示していて強調表示されているときはいつでも、リンクをクリックできません。

各列または行を編集できるように TableView を設定すると、2 回クリックして編集モードに入り、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]];
}

リンクはリンクのように見えますが、クリックは実際にはボタンの押下であり、これをアクション メソッドで検出し、NSWorkspace を使用してディスパッチします。

于 2011-06-14T20:36:57.353 に答える
0

ハイパーリンクに関する Apple のテクニカル ノートを見たことがありますか?

NSTextField と NSTextView へのハイパーリンクの埋め込み

于 2011-02-23T05:34:41.780 に答える