Один из подходов, который я использовал, - это не пытаться применить действия контекстного меню к одному конкретному элементу, по которому был сделан щелчок, а к выбранным элементам. И я добавляю выбранный элемент к выделению.
Я использовал настраиваемое представление для представления элемента коллекции. У настраиваемого класса представления есть выход item
к его собственному элементу представления коллекции, который я подключаю в NIB. Он также отменяет -rightMouseDown:
, чтобы элемент добавлялся в выборку:
- (void) rightMouseDown:(NSEvent*)event
{
NSCollectionView* parent = self.item.collectionView;
NSUInteger index = NSNotFound;
NSUInteger count = parent.content.count;
for (NSUInteger i = 0; i < count; i++)
{
if ([parent itemAtIndex:i] == self.item)
{
index = i;
break;
}
}
NSMutableIndexSet* selectionIndexes = [[parent.selectionIndexes mutableCopy] autorelease];
if (index != NSNotFound && ![selectionIndexes containsIndex:index])
{
[selectionIndexes addIndex:index];
parent.selectionIndexes = selectionIndexes;
}
return [super rightMouseDown:event];
}
Если вы предпочитаете, вместо того, чтобы добавлять элемент в выборку, вы можете проверить, есть ли он уже в выборке. Если это так, не изменяйте выбор. Если это не так, замените выделенный элемент только на этот элемент (сделав его единственным выбранным элементом).
В качестве альтернативы вы можете установить контекстное меню в представлениях элементов, а не в представлении коллекции. Затем элементы меню могут быть нацелены либо на представление элемента, либо на элемент представления коллекции.
Наконец, вы можете создать подкласс NSCollectionView
и переопределить -menuForEvent:
. Вы все равно вызовете super
и вернете меню, которое он возвращает, но вы можете воспользоваться возможностью, чтобы записать событие и / или элемент в его местоположении. Чтобы определить это, вы должны сделать что-то вроде:
- (NSMenu*) menuForEvent:(NSEvent*)event
{
_clickedItemIndex = NSNotFound;
NSPoint point = [self convertPoint:event.locationInWindow fromView:nil];
NSUInteger count = self.content.count;
for (NSUInteger i = 0; i < count; i++)
{
NSRect itemFrame = [self frameForItemAtIndex:i];
if (NSMouseInRect(point, itemFrame, self.isFlipped))
{
_clickedItemIndex = i;
break;
}
}
return [super menuForEvent:event];
}
person
Ken Thomases
schedule
01.10.2014