Получение элемента NSArrayController для щелчка правой кнопкой мыши в NSCollectionView - PullRequest
2 голосов
/ 22 июня 2009

Я пытаюсь создать файловый менеджер, используя nscollectionview, и в настоящее время внедряю меню правой кнопки мыши для каждого элемента (т.е. копировать / удалять / переименовывать / и т. Д.). В настоящее время у меня есть:

  • NSCollectionView, связанный с NSArrayController, который содержит пользовательский объект
  • Подкласс NSBox в качестве представления для каждого элемента, он также отслеживает события мыши и передает их в контроллер
  • Контроллер имеет выход NSMenu (rcMenu), а также выход NSView (itemView) для подкласса NSBox, который должен находиться там, где всплывающее меню
  • Код для вызова меню:

    [NSMenu popUpContextMenu: rcMenu withEvent: событие forView: itemView];

После запуска это работает в том, что меню появляется при щелчке правой кнопкой мыши по элементу в представлении коллекции, но при проверке события, которое передается контроллеру, на самом деле я ничего не могу использовать, чтобы выяснить, по какому элементу щелкнули правой кнопкой мыши кроме координат x, y (которые кажутся для NSWindow, а не для элемента или NSCollectionView). То, что я действительно хочу, - это объект в NSArrayController, у которого его представление щелкнуло правой кнопкой мыши.

Это зависит от того, правильно ли я его настраивал, есть ли простой способ выяснить это, или это просто так сложно?

Ответы [ 2 ]

2 голосов
/ 22 июня 2009

Вы можете попробовать установить меню представления каждого элемента представления коллекции. Скорее всего, вы сделаете это, переопределив +defaultMenu в вашем классе представления элементов. Как только вы это сделаете, закомментируйте сообщение popUpContextMenu:withEvent:forView: и посмотрите, сможете ли вы обойтись без него.

Кроме того, тогда было бы не слишком сложно обслуживать разные меню для разных типов элементов (например, папки против пакетов и файлов, и при этом разные типы файлов). Вам, вероятно, придется переопределить -menuForEvent: вместо +defaultMenu.

1 голос
/ 12 июля 2013

Я нашел другое решение, которое могло бы помочь.

Для этого решения я создал подкласс NSCollectionViewItem и NSView соответственно (и для простоты объяснения) ItemViewController и ItemView.

Я предполагаю, что вы работаете с IB, где вы уже связали свой NSCollectionView с ContentArray вашего NSArrayController (также связывает selectionIndexes).

Затем добавьте объект ViewController в NIB и убедитесь, что его пользовательский класс установлен на ItemViewController. Теперь подключите его к выходу itemPrototype вашего NSCollectionView.

Затем добавьте объект пользовательского представления в NIB и установите для его пользовательского класса значение ItemView. Подключите его выход к свойству вида вашего ItemViewController.

В файле интерфейса ItemView создайте свойство, похожее на представленный объект. Под этим я подразумеваю что-то вроде:

@property (nonatomic, assign) id someRepresentedObjectPropertyName

Это будет свойство, которое будет представлять элемент в вашем NSArrayController. Теперь перейдите к файлу реализации ItemViewController и переопределите метод -setRepresentedObject:. Здесь мы сначала дадим дескриптору ItemViewController установку своего представленного объекта, а затем мы назначим тот же представленный объект свойству, которое мы сделали в ItemView. Переопределение будет выглядеть так:

-(void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    //Do some appropiate checking on the representedObject...

    if (self.view != nil) {
        [(ItemView *)self.view setSomeRepresentedObjectPropertyName:self.representedObject];
    }
}

Теперь, если вы вернетесь к реализации ItemView, вы можете переопределить метод -rightMouseUp:, построить / настроить NSMenu и использовать метод -popUpMenuPositioning...:. Для свойства someRepresentedObjectPropertyName ItemView должен быть указан правильный элемент в вашем NSArrayController.

EDIT:

Вместо переопределения -setRepresentedObject вы также можете привязать ItemView someRepresentedObjectPropertyName к representedObject.someRepresentedObjectPropertyName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...