Отображать значок и текст в одной ячейке NSTableView

Я хотел бы отобразить значок рядом с текстовым элементом в одной ячейке табличного представления.

Примером того, чего я хочу добиться, является список приложений в Системных настройках -> Учетные записи пользователей -> Элементы входа.

Что такое хороший способ?


person Nick Moore    schedule 02.08.2010    source источник


Ответы (1)


Здесь есть хороший пример того, как это сделать: http://www.cocoadev.com/index.pl?IconAndTextInTableCell Вы создаете свою собственную NSCell, которая одновременно рисует изображение и текст

@interface IconCell : NSCell 
{
NSArray * cellValue;
}
- (void)setObjectValue:(id <NSCopying>)object;
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView;

@implementation IconCell

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
NSDictionary * textAttributes =
    [NSDictionary dictionaryWithObjectsAndKeys:[NSFont 
userFontOfSize:10.0],NSFontAttributeName, nil];
NSPoint cellPoint = cellFrame.origin;

[controlView lockFocus];

[[cellValue objectAtIndex:1] compositeToPoint:NSMakePoint(cellPoint.x+2,
cellPoint.y+14) operation:NSCompositeSourceOver];
[[cellValue objectAtIndex:0] drawAtPoint:NSMakePoint(cellPoint.x+18,
cellPoint.y) withAttributes:textAttributes];

[controlView unlockFocus];
}

- (void)setObjectValue:(id <NSCopying>)object
{
   cellValue = (NSArray *)object;
}
@end
person Jonas Jongejan    schedule 02.08.2010
comment
Стоит отметить, что эта ячейка требует, чтобы источник данных обслуживал массив (имя файла, значок) в качестве значения объекта. Дополнительный кредит для спрашивающего: адаптируйте код ячейки, чтобы он ожидал NSURL в качестве значения объекта, и получите от него как имя файла, так и значок. - person Peter Hosey; 02.08.2010
comment
Круто, хорошая штука. Что я на самом деле делаю в данный момент, так это привязываю свое табличное представление через контроллер массива к массиву идентификаторов пакетов через преобразователь значений, который преобразует идентификатор пакета в отображаемое имя приложения. Я думаю, что мой преобразователь значений может вывести комбинацию изображения и текста для рисования ячейки. Во всяком случае мне нужно будет прочитать о NSCell сейчас. Что-то, с чем мне раньше не приходилось сталкиваться... - person Nick Moore; 02.08.2010
comment
Использование -tableView:willDisplayCell: метода делегата для установки части изображения позволяет избежать необходимости использовать массив в качестве значения объекта. Его также можно свободно смешивать с Bindings. - person Joshua Nozzi; 02.08.2010