Получить представленный объект в действии представления элемента NSCollectionView

Вот что у меня есть:

  • An NSCollectionView
  • Заполняется через NSArrayController
  • Каждый «элемент» (NSCollectionViewItem) показывает свое содержимое в прикрепленном представлении.
  • Это представление содержит NSButton

Теперь вопрос:

Когда пользователь нажимает кнопку, как я могу определить, какой объект представлен? (элемент, прикрепленный к этому конкретному представлению, которому принадлежит кнопка)

P.S. Очевидно, я могу сделать что-то вроде:

NSInteger itemIndex = [[_collectionView subviews] indexOfObject:[sender superview]];
MyItem item = _items[itemIndex];

Но выглядит это совсем нехорошо, хотя действительно работает.

Идеи?


person Dr.Kameleon    schedule 26.12.2014    source источник
comment
На каком объекте по отношению к перечисленным вами объектам реализован метод действия?   -  person Ken Thomases    schedule 26.12.2014
comment
У вас есть возможность управления получением информации о соответствующем объекте модели через иерархию представлений... это уродливо? Подклассы менее просты. Привязки кажутся элегантными, но могут иметь больше накладных расходов, чем indexOfObject. Если вы хотите быстро связать кнопку с объектом модели, используйте keyEquivalent. Но, в конце концов, я сомневаюсь, что вы доберетесь до представленного объекта быстрее.   -  person stevesliva    schedule 26.12.2014


Ответы (1)


Вы не говорите, какой объект является целью действия кнопки. Вы можете сделать это несколькими способами.

Например, вы можете использовать собственный подкласс NSCollectionViewItem. Вы бы нацелили действие кнопки на элемент представления коллекции. Затем элемент представления коллекции будет напрямую обращаться к своему собственному свойству representedObject. При необходимости он может затем вызвать другой объект (например, оконный контроллер) с необходимой информацией. Или просто вызовите метод для представленного объекта, если это уместно.

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

Другой подход — использовать привязки для кнопки. Вы можете связать его цель (включая указание селектора), а также можете связать аргумент, который будет передан селектору. Вы можете привязать цель к элементу представления коллекции (владелец файла в NIB представления элемента представления коллекции) с путем ключа модели representedObject. Затем кнопка нацеливается непосредственно на представленный объект.

Или вы можете привязать цель кнопки к чему-то другому и привязать аргумент к элементу представления коллекции, путь к ключу модели representedObject. Таким образом, кнопка будет вызывать метод объекта и передавать представленный объект в качестве аргумента этому методу.

person Ken Thomases    schedule 26.12.2014
comment
Вы также можете обеспечить уникальную строку для каждого представляемого объекта и поддерживать NSButton keyEquivalent каким-то образом запрашивать модель данных напрямую с помощью ключа, но, как я сказал в комментарии, я не считаю исходное решение иерархии представлений уродливым в первую очередь . - person stevesliva; 26.12.2014