4

По какой-то причине NSButtonCell для моего представления таблицы передает неправильный объект в качестве параметра. Я пытаюсь прочитать тег 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]; 
} 

resut из консоли говорит:

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

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

ответ

4

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

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

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

спасибо, что помогло много –

4

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

+1

Это самое элегантное решение. Спасибо ! – StefanS

Смежные вопросы