Pregunta

Por alguna razón el NSButtonCell para mi vista de tabla está pasando el objeto equivocado como parámetro. Estoy tratando de leer la etiqueta de la NSButtonCell después de que se hace clic.

Esta es una versión simplificada de mi código:

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

El resut desde la consola dice:

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

A primera vista (al menos para mí) esto debería decir que la etiqueta es de 100, pero no es así. También (como se puede observar a partir de la segunda salida de la consola), parece ser que el parámetro que se envía al selector "buttonClick" es incorrecto, creo que debería estar recibiendo el NSButtonCell, pero que está recibiendo el NSTableView.

¿Fue útil?

Solución

Al parecer, el emisor es su vista de tabla, pero no el de células específicas de la vista de tabla.

No tengo ni idea acerca de cómo dejar la celda de tabla se convierten en el emisor, pero se puede saber qué célula se hace clic en buscar el índice de la fila pulsada y la columna, y entonces usted puede hacer lo que debe suceder después de la célula se hace 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]);
}

Otros consejos

En este caso, el remitente es de hecho una NSTableView pero se puede recuperar la fila y la columna del control que activa realmente el caso, simplemente con [clickedRow remitente] y [clickedColumn remitente].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top