Как установить цвет фона при выборе строки NSOutlineView

У меня большая проблема, и я не могу ее решить.

У меня есть NSOutlineView, который содержит NSButtonCell, который связан с arrayController, оттуда он устанавливает свой Title, и на основе некоторого значения изображение устанавливается в фоновом режиме ячейки с помощью кодов.

Изображение устанавливается с использованием этих кодов

[cell setImage:[NSImage imageNamed:@"sbWarn.png"]];
[cell setImagePosition:NSImageOverlaps];
[cell setBackgroundColor:[NSColor clearColor]];

Проблема в том, что когда я выбираю строку, выбранная строка показывает черный фон. Я пробовал все возможные способы, такие как установка фона как clearColor и т. Д.

Как мне сделать так, чтобы это выглядело хорошо.


person Anoop Vaidya    schedule 15.04.2013    source источник
comment
Вы, вероятно, можете решить это, только создав свой собственный потомок ячейки и рисуя там. Это также открывает больше возможностей для рисования содержимого (например, более одного изображения, значки, разные цвета текста и т. д. и т. д.).   -  person Mike Lischke    schedule 15.04.2013
comment
Я так понимаю, что рассматриваемый вид схемы основан на ячейке. Табличные представления на основе представлений (и, следовательно, также контурные представления) предоставляют средства для рисования фона (хотя вам придется копаться в документах), но вы потеряете возможность использовать привязки таким же образом, поэтому не уверен, что оно того стоит.   -  person Monolo    schedule 15.04.2013
comment
Однако здесь может быть что-то: stackoverflow.com/questions/2062605/   -  person Monolo    schedule 15.04.2013
comment
@Monolo: да, это сотовая связь. Я пробовал все: без полей, setTransparent, непрозрачный и различные доступные свойства nsbuttoncell. Если кнопка нарисована в окне, она работает, здесь она в nsview, так что это добавляет сложности.   -  person Anoop Vaidya    schedule 15.04.2013
comment
@Monolo: увидев ответ, я хотел поставить минус, но редко это делаю :p   -  person Anoop Vaidya    schedule 15.04.2013


Ответы (2)


Этот подход должен работать. Это по памяти, поэтому никаких гарантий, но быстрый макет, похоже, дал результаты, которые вы ищете:

// Outline view delegate

-(void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {

    NSUInteger rowNo = [outlineView rowForItem:item];

    NSColor *backgroundColor;
    if ( [[outlineView selectedRowIndexes] containsIndex:rowNo] ) {
        backgroundColor = // Highlighted color;
    }
    else {
        backgroundColor = // Normal background color;
    }

    [cell setBackgroundColor: backgroundColor];
}

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

Это используемая кнопочная ячейка, созданная в outlineView:dataCellForTableColumn:item:.

NSButtonCell *cell = [[NSButtonCell alloc] init];

[cell setBezelStyle:NSRegularSquareBezelStyle];
[cell setButtonType:NSToggleButton];
[cell setBordered:NO];
[cell setTitle:@""];
[cell setImage:[NSImage imageNamed:@"green.png"]];
[cell setAlternateImage:[NSImage imageNamed:@"red.png"]];
[cell setImagePosition:NSImageOverlaps];
person Monolo    schedule 15.04.2013
comment
@AnoopVaidya Я только что проверил это на своем небольшом испытательном стенде, и это тоже работает. Ты что-нибудь делаешь в своем outlineView:willDisplayCell:forTableColumn:item:? - person Monolo; 16.04.2013
comment
если я делаю это непосредственно в nswindow, это работает, но это рисуется на nsview - person Anoop Vaidya; 16.04.2013
comment
Понимаю. Не уверен, что понимаю разницу, но удачи в погоне за этим :-) - person Monolo; 16.04.2013
comment
Теперь я пытаюсь создать подкласс NSButtonCell... у вас есть какие-нибудь идеи, я никогда не делал этого раньше - person Anoop Vaidya; 16.04.2013
comment
Нет, не особо. Комментарий @MikeLischke, вероятно, верен, если вы не хотите устанавливать простой цвет в outlineView:willDisplayCell:forTableColumn:item:. - person Monolo; 16.04.2013
comment
если использовалась схема на основе просмотра! тогда? - person Muruganandham K; 12.02.2014

Я думаю, вы должны использовать тип кнопки как «Мгновенное изменение». Вы можете изменить его в свойствах кнопки.

person ADJ    schedule 19.07.2013