2009-04-19 10 views
6

J'ai un NSAttributedString que j'utilise dans un NSTextFieldCell. Il crée plusieurs liens URL cliquables et place une grande chaîne NSAttributedString à l'intérieur de NSTextFieldCell. Chaque fois que je regarde le NSTextFieldCell normalement et qu'il est en surbrillance, je ne peux pas cliquer sur les liens.Lien d'URL cliquable dans NSTextFieldCell à l'intérieur de NSTableView?

Si je règle TableView pour pouvoir modifier chaque colonne ou ligne, lorsque je clique deux fois, passe en mode Edition et affiche le contenu de NSTextFieldCell, mes liens s'affichent et sont cliquables. Lorsque je clique sur la ligne, je ne vois plus les liens cliquables.

Je dois être en mode «édition» pour voir les liens ou cliquer dessus. J'ai l'impression qu'il y a un réglage que je manque juste.

Répondre

1

Je ne pense pas que la note technique répond à la question qui était de savoir comment mettre un lien dans une cellule NSTableView. Le meilleur moyen que j'ai trouvé pour faire ceci est d'utiliser une cellule de bouton pour la cellule de table. Cela suppose que seuls les liens seront dans une colonne particulière de la table.

Dans Interface Builder, faites glisser une cellule NSButton sur la colonne de la table où vous souhaitez les liaisons.

Dans votre délégué vue de la table, mettre en œuvre tableView: dataCellForTableColumn: ligne: comme suit:

- (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); 
} 

Définir la cible/action pour la table à votre délégué et vérifier les clics sur la colonne de lien:

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

Maintenant, le lien ressemble comme un lien, mais un clic est en fait un appui sur un bouton, que vous détectez dans la méthode d'action et distribuez en utilisant NSWorkspace.

Questions connexes