Question

Pour une raison quelconque le NSButtonCell pour moi de table passe le mauvais objet en tant que paramètre. Je suis en train de lire l'étiquette du NSButtonCell après avoir été cliqué.

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 de 100, mais il ne fonctionne pas. De plus (comme on peut le voir à partir de la deuxième sortie de la console), il apparaît 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.

Était-ce utile?

La solution

Apparemment, l'expéditeur est votre point de vue de la table, mais pas votre cellule spécifique vue tableau.

Je ne sais pas sur la façon de laisser la cellule de table soit l'expéditeur, mais vous pouvez savoir quelle cellule est cliqué par la recherche de l'index de la ligne sélectionnée et la colonne, et vous pouvez faire ce qui doit se produire après la cellule est cliqué.

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

Autres conseils

Dans ce cas, 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].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top