Это почти наверняка не лучший способ сделать это, и я объясню почему потом: однако, похоже, это работает.Замените метод drawInteriorWithFrame:inView:
вашего класса ячеек следующим:
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
DataItem* dataItem = [(NSObjectWrapper*)[self objectValue] original];
[[m_view name] setStringValue:dataItem.name];
[[m_view occupation] setStringValue:dataItem.occupation];
[m_view setFrame:cellFrame];
NSData *d = [m_view dataWithPDFInsideRect:[m_view bounds]];
NSImage *i = [[NSImage alloc] initWithData:d];
[i setFlipped:YES];
[i drawInRect:cellFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
}
Проблема в том, что для всей таблицы создается только один NSCell.Вот как должны работать ячейки: табличное представление создает ячейку и вызывает setObject… и затем drawInterior… снова и снова, чтобы заставить ячейку рисовать всю таблицу.Это замечательно с точки зрения эффективности (класс NSCell был разработан еще тогда, когда 25 МГц был быстрым компьютером, поэтому он был нацелен на минимизацию количества распределений объектов), но здесь возникают проблемы.
В вашем коде вы заполняетепросмотрите значения и установите его фрейм, добавив его как подпредставление табличного представления при необходимости.Однако, поскольку у вас есть только один экземпляр NSCell, может быть только одно представление: вы взяли одно имеющееся у вас представление и просто переместили его вниз по строкам таблицы.
Чтобы сделать это правильно,вам потребуется некоторая структура данных для отслеживания всех представлений, которые вы добавили в качестве подпредставлений вашего NSTableView, а когда ячейка обновляет один в методе drawInterior…, вам нужно будет найти, какой из них был правильный, и обновить его.Вам также нужно было бы выделить все эти представления в коде (или, по крайней мере, переместить представление в отдельное перо, в которое можно было бы загрузить несколько копий), потому что, поскольку у вас есть только одно перо, копирование представленияболь.
Код, который я написал, - это клочок, поскольку он действительно неэффективен.То, что я делал, было каждый раз, когда нужно рисовать представление, я рисовал представление в буфере изображения вне экрана, а затем перетаскивал буфер в правильное место в представлении таблицы.При этом я избежал проблемы наличия только одного представления, поскольку код просто берет и рисует новую копию своего содержимого всякий раз, когда это необходимо.![enter image description here](https://i.stack.imgur.com/Vny3K.png)