Я хотел, чтобы кнопка отображалась в табличном представлении в качестве первого элемента в последней строке вместо обычных данных, поэтому я создал подкласс NSTableView и перезаписал подготовленныйCellAtColumn: row: метод для генерации желаемого поведения в последний ряд.
- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row {
if(row < [self numberOfRows]-1) {
return [super preparedCellAtColumn:column row:row];
} else {
// if we're on the last row, we're going to add the button instead of data
if(column == 0) {
NSButtonCell *button = [[NSButtonCell alloc] initTextCell:self.buttonTitle];
[button setEditable:YES];
[button setSelectable:YES];
[button setBezelStyle:NSTexturedSquareBezelStyle];
[button setGradientType:NSGradientConvexWeak];
[button setButtonType:NSMomentaryPushInButton];
[button setHighlightsBy:NSBackgroundStyleLowered];
[button setAction:@selector(openAddDialog)];
[button setControlView:self];
return button;
} else {
NSTextFieldCell *emptyCell = [[NSTextFieldCell alloc] initTextCell:@""];
[emptyCell setEditable:NO];
[emptyCell setSelectable:NO];
return emptyCell;
}
}
}
К счастью, функционал работает - кнопка появляется в последнем ряду и при нажатии вызывает селектор openAddDialog. Однако есть две визуальные проблемы:
1. Кнопка не подсвечивается (нажимается) при нажатии.
2. Таблица выбирает строку с кнопкой при ее нажатии.
Я все еще довольно новичок в Objective C и Cocoa, поэтому я не совсем уверен, где искать решения для них. Почему при нажатии кнопки метод setHighlighted кнопки не вызывается? Какой метод вызывается непосредственно перед тем, как NSTableView выберет строку, чтобы я мог переопределить ее и запретить выбирать последнюю строку?
В итоге я решил свой второй вопрос, переопределив функцию selectRowIndexes: byExtendingSelection: в моем подклассе таблицы и просто не передав индекс последней строки в суперфункцию.