Обновление NSCell при изменении другого NSCell

У меня есть два столбца в моем NSOutlineView. Одна из них представляет собой ячейку с текстом и изображением (аналогично классу в примере кода DragNDropOutlineView Apple). Рядом с этим находится пользовательский подкласс NSCell под названием «XFToggleCell», который используется для отображения значка видимости (глазного яблока), который вы можете включать и выключать (как в Photoshop).

XFToggleCell поддерживает отслеживание/перетаскивание мышью (опять же, как в Photoshop), поэтому вы можете щелкнуть одним глазным яблоком, а затем перетащить вниз, чтобы показать/скрыть несколько элементов одновременно. В ячейке текста и изображения я отображаю текст серым цветом, когда элемент скрыт, и черным, когда он не скрыт.

Почти все работает нормально. Когда я нажимаю на глазное яблоко (XFToggleCell), его изображение очищается, и объект моей модели становится скрытым. Однако шрифт смежной ячейки текста и изображения не становится серым (он не обновляется), пока я снова не нажму на ячейку-переключатель... и когда я это сделаю, окраска текста изображения и текстовой ячейки всегда противоположна тому, что так и должно быть (при нажатии на видимость текст становится серым, и наоборот).

Я определил, что это происходит потому, что ячейка текста и изображения перерисовывается до изменения значения переключаемой ячейки. В результате его отображение всегда «отстает на один клик». Последовательность выглядит следующим образом:

  1. Я нажимаю кнопку мыши на ячейке переключения столбца 1.
  2. Ячейка текста и изображения в столбце 0 перерисовывается.
  3. Значение объекта для переключаемой ячейки в столбце 1 изменено.
  4. Ячейка-переключатель в столбце 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;
}

person Todd Burch    schedule 14.06.2012    source источник
comment
Другой способ задать этот вопрос: как мне установить зависимость ячейки текста и изображения от моего пользовательского XFToggleCell?   -  person Todd Burch    schedule 14.06.2012


Ответы (1)


Ну, я не совсем уверен, почему, но звоню

[(NSOutlineView *)controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:col row:row]];

не сработало, когда я поставил его в конце

-(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView

в моем классе XFToggleCell.

Поэтому я попытался добавить

[outlineView setNeedsDisplayInRect:[outlineView frameOfCellAtColumn:col row:row]];

в конце моего

-(void) outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

метод в моем источнике данных NSOutlineView, и он сработал. Не уверен, почему, но вот как это сделать. Если кто-нибудь может пролить свет на то, почему это не сработало, вызывая по существу то же самое в ячейке, я был бы признателен за информацию.

person Todd Burch    schedule 15.06.2012