Проблема разработки: Core Animation, NSCollectionView и NSCollectionViewItems


Я борюсь с проблемой дизайна: у меня есть NSCollectionView который содержит несколько элементов (это связано с NSArrayController который, в свою очередь, связан с NSManagedObjectContext). Я решил нарисовать представление для каждого элемента программно, главным образом потому, что заметил, что несколько NSViews в представлении элементов создает проблемы с производительностью, когда в представлении набора больше определенного количества элементов.
Рассмотрим следующую иерархию: NSCollectionView => NSCollectionViewItem -> NSView, (По умолчанию используется NSCollectionView). Мой обычай NSView содержит несколько слоев, некоторые CATextLayerс, другие регулярные CALayerс, и все они оживляют вместе (в одном и том же CATransaction) всякий раз, когда им нужно. Проблема в том, что каждый CALayer необходимо отобразить содержимое некоторых данных, которые доступны через representedObject собственность NSCollectionViewItem... который владеет NSView! У меня есть два варианта (вероятно, гораздо больше, я более чем открыт для предложений):
- Я повторяю representedObject от NSCollectionViewItem к его NSView, и я держу это последовательно во время выполнения программы. Мне не очень нравится этот.
- Я выставляю CALayerв NSViewи я установил их содержимое / строку изнутри NSCollectionViewItem"s setRepresentedObject: метод. Мне больше нравится этот, потому что в NSView (за исключением того, что показано через слои, конечно).
Я ошибся? Есть ли более элегантное решение?

Заранее спасибо, я очень ценю помощь. ура

Джан Марко

1 ответ

Решение

С этим вопросом столкнулся довольно поздно, и я подумал, что это интересная проблема дизайна.

Если вы не взломали это или вам не понравилось ни одно из ваших решений:

Я хотел бы предложить написать подкласс NSCollectionViewItem, который наблюдает ключевые пути self.representedObject и обновляет его представление и подпредставления при изменении объекта модели.

NSCollectionViewItem - это NSViewController, который подразумевает, что он должен отвечать за управление своими представлениями. Вы можете уважать это, имея слой представления, с которым он работает, в виде пользовательского представления своего объекта модели, хранящегося в его свойстве presentObject. Таким образом, наблюдая за всеми необходимыми свойствами модели с помощью KVO, вы должны иметь удобное место для вызова всех операций представления, касающихся "рендеринга" модели. На этом этапе вы должны иметь полный контроль над тем, хотите ли вы работать с NSView API или CALayer API.

Основываясь на том, насколько сложен ваш вид элемента прототипа, размер и волатильность набора элементов, требование UI "живости" и другие факторы, вы можете обойтись без очень грубого наблюдения модели, или нужен очень мелкозернистый - надеюсь, вы привыкли работать с KVO API!

Я также хотел бы услышать, какой выбор вы сделали в конце.

Другие вопросы по тегам