Получение отображаемого изображения из NSImageCell - PullRequest
2 голосов
/ 20 июня 2011

У меня есть NSImageCell столбец таблицы, чья valuePath связана с путем, предоставленным моим объектом через NSArrayController.

My NSTableViewDelegate реализует метод -tableView:heightOfRow:, чтобы иметь переменную высоту строки. Мне нужно рассчитать высоту строки на основе размеров изображения, отображаемого в вышеупомянутом столбце.

Прямо сейчас я получаю ужасную производительность, так как я вызываю [[NSImage alloc] initWithContentsOfFile:<path>] для каждой итерации. Есть ли способ загрузить представление изображения, которое каждый NSImageCell уже извлек для отображения?

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

Я попробовал метод NSTableColumn -dataCellForRow:, который звучал идеально, за исключением того, что возвращаемая ячейка возвращает objectValue, который, похоже, является последней строкой, для которой были загружены данные.

Обновление (решение неудовлетворительное)

Я нашел примерное решение (опубликовано одновременно ниже), но оно кажется неуклюжим (и я уже видел, как оно проваливалось в случайные, невоспроизводимые времена), и я все еще ищу лучшее решение.

Я использую метод делегата -tableView:willDisplayCell:forTableColumn:row:, чтобы заполнить изменяемый словарь ключом [[cell objectValue] size] (размер изображения), связанным с уникальным идентификатором представляемого объекта. Затем в вызове -tableView:heightOfRow: я ищу обложку из этого словаря. Мне нужно позвонить [tableView noteNumberOfRowsChanged] после загрузки данных, иначе словарь не будет заполнен должным образом для начального экрана данных.

1 Ответ

1 голос
/ 20 июня 2011

Я попробовал метод NSTableColumn -dataCellForRow:, который звучал идеально, за исключением того, что возвращаемая ячейка возвращает значение objectValue, которое представляется последней строкой, для которой были загружены данные.

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

На вашем месте, я бы, вероятно, попытался бы реализовать – tableView:willDisplayCell:forTableColumn:row:метод в вашем NSTableViewDelegate.Затем вы можете перехватить ячейку до того, как она будет нарисована, получить ее значение в этот момент и кэшировать только ее высоту (как NSNumber* или CGFloat).Затем вы можете вернуть это значение в -tableView:heightOfRow:.

С другой стороны, возможно, что -tableView:heightOfRow: будет вызван раньше – tableView:willDisplayCell:forTableColumn:row:, так что он может не работать.Я не уверен.Но вот с чего бы я начал.

...