Вопрос

По какой-то причине 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.

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top