2014-05-02 2 views
1

J'ai une NSTextFieldCell dans une colonne d'une NSTableView basée sur une cellule. Cette cellule devrait gérer les clics. Cela fonctionne bien lorsqu'aucune touche de modification n'est enfoncée. Si je maintiens les touches Maj ou Commande, la vue table avale l'événement mouseDown dans le but de gérer la sélection des lignes.Suivi de la souris avec des touches de modification dans la cellule de la table

Existe-t-il un moyen de désactiver complètement la sélection de ligne dans NSTableView?

Existe-t-il un moyen de faire passer tous les événements par NSTableView?

Ma sous-classe de cellule est dérivée de LinkTextFieldCell dans l'exemple de code TableViewLinks. Il met en œuvre:

- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame ofView:(NSView *)controlView untilMouseUp:(BOOL)flag 

Depuis que je ne veux pas la sélection de la ligne, mon délégué vue de tableau met en œuvre:

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)rowIndex 
{ 
    return NO; 
} 

- (BOOL)tableView:(NSTableView *)tableView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    return YES; 
} 

Mes méthodes déléguées sont appelées à partir - [NSTableView mouseDown:]. Le code de suivi de la souris est appelé lorsque aucune touche de modification n'est enfoncée.

Existe-t-il une meilleure façon de résoudre ce problème que de sous-classer NSTableView pour remplacer - [NSTableView mouseDown:]?

+0

Pouvez-vous avoir la table refusesFirstResponder? C'est tout ce que je peux penser, mais je ne suis pas sûr que ça ne casserait pas autre chose. – stevesliva

+0

Pour une raison que j'ignore, j'ai déjà accepté le retour NON-Répondeur NON. Ça ne fait aucune différence. –

Répondre

0

J'ai implémenté une solution où je remplace mouseDown :. Je ne l'aime pas vraiment. Mais ça fonctionne. Espérant toujours de meilleures idées.

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    if (! [self handleMouseDown:theEvent]) { 
     [super mouseDown:theEvent]; 
    } 
} 

- (BOOL)handleMouseDown:(NSEvent *)theEvent 
{ 
    NSInteger     clickCount     = [theEvent clickCount]; 

    if (clickCount != 1) { 
     return NO; 
    } 

    NSPoint      locationInWindow   = [theEvent locationInWindow]; 
    NSPoint      locationInView    = [self convertPoint:locationInWindow fromView:nil]; 
    NSInteger     clickedRow     = [self rowAtPoint:locationInView]; 
    NSInteger     clickedColumn    = [self columnAtPoint:locationInView]; 

    if ((clickedRow < 0) || (clickedColumn < 0)) { 
     return NO; 
    } 

    if ((clickedRow >= [self numberOfRows]) || (clickedColumn >= [self numberOfColumns])) { 
     return NO; 
    } 

    NSArray      *tableColumns    = [self tableColumns]; 

    NSTableColumn    *tableColumn    = [tableColumns objectAtIndex:clickedColumn]; 
    NSCell      *cell      = [tableColumn dataCellForRow:clickedRow]; 

    id <NSTableViewDelegate> delegate     = [self delegate]; 
    BOOL      shouldTrackCell    = NO; 

    if ([delegate respondsToSelector:@selector(tableView:shouldTrackCell:forTableColumn:row:)]) { 
     shouldTrackCell = [delegate tableView:self shouldTrackCell:cell forTableColumn:tableColumn row:clickedRow]; 
    } 

    if (! shouldTrackCell) { 
     return NO; 
    } 

    BOOL      prefersTrackingUntilMouseUp = [[cell class] prefersTrackingUntilMouseUp]; 
    NSRect      cellFrame     = [self frameOfCellAtColumn:clickedColumn row:clickedRow]; 

    return [cell trackMouse:theEvent inRect:cellFrame ofView:self untilMouseUp:prefersTrackingUntilMouseUp]; 
} 
Questions connexes