Я часами искал ответ на этот вопрос, и хотя я нашел много фрагментов, ни один из них не был полным.Итак, здесь я представлю другой подход, который я использую с успехом.
1) Установите для NSTableView selectionHighLightStyle значение None
Это необходимо для того, чтобы OSX не просто применял свои собственные блики наднаверху, оставляя вас с синей подсветкой.
Вы можете сделать это либо через IB, либо с помощью кода.
2) Подкласс NSTableView и переопределить drawRow.
Этоустановит цвет фона для выбранных вами строк на основной (активное окно) и вторичный (неактивный).
- (void)drawRow:(NSInteger)row clipRect:(NSRect)clipRect
{
NSColor* bgColor = Nil;
if (self == [[self window] firstResponder] && [[self window] isMainWindow] && [[self window] isKeyWindow])
{
bgColor = [NSColor colorWithCalibratedWhite:0.300 alpha:1.000];
}
else
{
bgColor = [NSColor colorWithCalibratedWhite:0.800 alpha:1.000];
}
NSIndexSet* selectedRowIndexes = [self selectedRowIndexes];
if ([selectedRowIndexes containsIndex:row])
{
[bgColor setFill];
NSRectFill([self rectOfRow:row]);
}
[super drawRow:row clipRect:clipRect];
}
3) Реализуйте NSTableViewDelegate, присоедините его к вашему NSTableView и внедрите willDisplayCell.
Это позволит вам изменить textColor строк при выделении / отмене выделения, если цвета выделения затрудняют чтение текста.
- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
// check if it is a textfield cell
if ([aCell isKindOfClass:[NSTextFieldCell class]])
{
NSTextFieldCell* tCell = (NSTextFieldCell*)aCell;
// check if it is selected
if ([[aTableView selectedRowIndexes] containsIndex:rowIndex])
{
tCell.textColor = [NSColor whiteColor];
}
else
{
tCell.textColor = [NSColor blackColor];
}
}
}
И все готово.