4

Pour une raison quelconque, NSButtonCell pour ma vue de table transmet le mauvais objet en tant que paramètre. J'essaie de lire la balise de NSButtonCell après avoir cliqué dessus.Problèmes avec l'action NSButtonCell

Voici une version simplifiée de mon code:

- (int)numberOfRowsInTableView:(NSTableView *)aTableView { 
    return 3; 
} 

- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex { 
    [aCell setTitle:@"Hello"]; 
    [aCell setTag:100]; 
} 

- (void)buttonClick:(id)sender { 
    NSLog(@"THE TAG %d",[sender tag]); 
    NSLog(@"THE TITLE: %@",[sender title]); 
} 

- (void)refreshColumns { 
    for (int c = 0; c < 2; c++) { 
     NSTableColumn *column = [[theTable tableColumns] objectAtIndex:(c)]; 

     NSButtonCell* cell = [[NSButtonCell alloc] init]; 
     [cell setBezelStyle:NSSmallSquareBezelStyle]; 
     [cell setLineBreakMode:NSLineBreakByTruncatingTail]; 
     [cell setTarget:self]; 
     [cell setAction:@selector(buttonClick:)]; 
     [column setDataCell:cell]; 
    } 
} 

- (void)awakeFromNib { 
    [self refreshColumns]; 
} 

Le resut de la console dit:

THE TAG: 0 
    -[NSTableView title]: unrecognized selector sent to instance 0x100132480 

A première vue (pour moi au moins) cela devrait dire que l'étiquette est 100, mais ce n'est pas le cas. Aussi (comme il peut être vu de la deuxième sortie de la console), il semble que le paramètre envoyé au sélecteur "buttonClick" est incorrect, je crois qu'il devrait recevoir le NSButtonCell, mais il reçoit le NSTableView.

Répondre

4

Apparemment, l'expéditeur est votre vue de table mais pas votre cellule de vue de table spécifique. Je n'ai aucune idée sur la façon de laisser la cellule de tableau devenir l'expéditeur, mais vous pouvez savoir quelle cellule est cliquée en recherchant l'index de la ligne et de la colonne cliquées, et ensuite vous pouvez faire ce qui doit se passer après le la cellule est cliquée. l'expéditeur est en effet un NSTableView mais vous pouvez récupérer la ligne et la colonne du contrôle qui a effectivement déclenché l'événement simplement avec [expéditeur clickedRow] et [expéditeur clickedColumn]

- (void)buttonClick:(id)sender { 
    NSEvent *event = [NSApp currentEvent]; 
    NSPoint pointInTable = [tableView convertPoint:[event locationInWindow] fromView:nil]; 
    NSUInteger row = [tableView rowAtPoint:pointInTable]; 
    NSTableColumn *column = [[tableView tableColumns] objectAtIndex:[tableView columnAtPoint:pointInTable]]; 
    NSLog(@"row:%d column:%@", row, [column description]); 
} 
+0

merci, cela a beaucoup aidé –

4

Dans ce cas.

+1

C'est la solution la plus élégante. Je vous remercie ! – StefanS