У меня есть два столбца в моем NSOutlineView. Одна из них представляет собой ячейку с текстом и изображением (аналогично классу в примере кода DragNDropOutlineView Apple). Рядом с этим находится пользовательский подкласс NSCell под названием «XFToggleCell», который используется для отображения значка видимости (глазного яблока), который вы можете включать и выключать (как в Photoshop).
XFToggleCell поддерживает отслеживание/перетаскивание мышью (опять же, как в Photoshop), поэтому вы можете щелкнуть одним глазным яблоком, а затем перетащить вниз, чтобы показать/скрыть несколько элементов одновременно. В ячейке текста и изображения я отображаю текст серым цветом, когда элемент скрыт, и черным, когда он не скрыт.
Почти все работает нормально. Когда я нажимаю на глазное яблоко (XFToggleCell), его изображение очищается, и объект моей модели становится скрытым. Однако шрифт смежной ячейки текста и изображения не становится серым (он не обновляется), пока я снова не нажму на ячейку-переключатель... и когда я это сделаю, окраска текста изображения и текстовой ячейки всегда противоположна тому, что так и должно быть (при нажатии на видимость текст становится серым, и наоборот).
Я определил, что это происходит потому, что ячейка текста и изображения перерисовывается до изменения значения переключаемой ячейки. В результате его отображение всегда «отстает на один клик». Последовательность выглядит следующим образом:
- Я нажимаю кнопку мыши на ячейке переключения столбца 1.
- Ячейка текста и изображения в столбце 0 перерисовывается.
- Значение объекта для переключаемой ячейки в столбце 1 изменено.
- Ячейка-переключатель в столбце 1 перерисовывается.
Если я смогу принудительно перерисовать текст и ячейку изображения в столбце 0, как описано выше в шаге 5, все будет хорошо.
Как принудительно обновить рисунок ячейки текста и изображения столбца 0 в результате нажатия на ячейку столбца 1?
Вот реализация того, что я считаю ключевым методом... В моем XFToggleCell.m, который находится в столбце 1:
- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
{
.
.
.
...do some stuff...
.
.
.
//Here's where I change the cell's object value, causing the cell to be redrawn.
//This part works fine.
[self setObjectValue:([self.representedObject newState]) ? self.image : nil];
.
.
.
//Why doesn't this next line update the adjacent cell?!?!?!?!?
//Column 0 contains the text and image cell I'm trying to update
[controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:0 row:thisRow]];
}
return YES;
}