Проблемы с действием NSButtonCell - PullRequest
4 голосов
/ 24 марта 2010

По какой-то причине NSButtonCell для моего табличного представления передает неверный объект в качестве параметра. Я пытаюсь прочитать тег NSButtonCell после его нажатия.

Вот упрощенная версия моего кода:

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

Результат из консоли говорит:

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

На первый взгляд (по крайней мере для меня) это должно сказать, что тег равен 100, но это не так. Кроме того (как видно из второго вывода консоли), похоже, что параметр, отправляемый в селектор «buttonClick», неверен, я считаю, что он должен получать NSButtonCell, но он получает NSTableView.

Ответы [ 2 ]

4 голосов
/ 28 января 2012

В этом случае отправителем действительно является NSTableView, но вы можете извлечь строку и столбец элемента управления, который фактически вызвал событие, просто с помощью [sender clickedRow] и [sender clickedColumn].

4 голосов
/ 24 марта 2010

Очевидно, что отправителем является ваше табличное представление, но не ваша конкретная ячейка табличного представления.

Я понятия не имею, как позволить ячейке таблицы стать отправителем, но вы можете узнать, по какой ячейке щелкают, посмотрев индекс строки и столбца, по которым щелкнули, и затем вы можете сделать то, что должно произойти после ячейки нажата.

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