Domanda

Per qualche motivo il NSButtonCell per la mia vista tabella sta passando l'oggetto sbagliato come parametro. Sto cercando di leggere l'etichetta del NSButtonCell dopo che è stato cliccato.

Ecco una versione semplificata del mio codice:

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

Il resut dalla console dice:

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

A prima vista (almeno per me) questo dovrebbe dire che il tag è di 100, ma non è così. Anche (come si vede dalla seconda uscita console), risulta che il parametro inviato al selettore "ButtonClick" non è corretto, ritengo che dovrebbe essere la ricezione del NSButtonCell, ma sta ricevendo il NSTableView.

È stato utile?

Soluzione

A quanto pare il mittente è la sua opinione tavolo, ma non il vostro specifico delle cellule vista tabella.

Non ho idea di come lasciare che la cella della tabella diventano il mittente, ma si può sapere quale cella è cliccato, cercando per l'indice della riga cliccato e la colonna, e allora si può fare ciò che dovrebbe accadere dopo la cella si fa clic.

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

Altri suggerimenti

In questo caso il mittente è davvero un NSTableView ma è possibile recuperare la riga e la colonna del controllo che in realtà ha generato l'evento semplicemente con [clickedRow mittente] e [clickedColumn mittente].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top