Проблема разработки: Core Animation, NSCollectionView и NSCollectionViewItems
Я борюсь с проблемой дизайна: у меня есть NSCollectionView
который содержит несколько элементов (это связано с NSArrayController
который, в свою очередь, связан с NSManagedObjectContext
). Я решил нарисовать представление для каждого элемента программно, главным образом потому, что заметил, что несколько NSView
s в представлении элементов создает проблемы с производительностью, когда в представлении набора больше определенного количества элементов.
Рассмотрим следующую иерархию: 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!
Я также хотел бы услышать, какой выбор вы сделали в конце.