Ein Ansatz, den ich verwendet habe, besteht darin, nicht zu versuchen, die kontextabhängigen Menüaktionen auf das eine bestimmte Element, auf das geklickt wurde, sondern auf die ausgewählten Elemente anzuwenden. Und ich mache das angeklickte Element zur Auswahl hinzufügen.
Ich verwendete eine benutzerdefinierte Ansicht für die Sammlungselementansicht. Die benutzerdefinierte Ansichtsklasse hat einen Ausgang item
zu seinem besitzenden Auflistungsansichtselement, das ich in der NIB verbinde. Er überschreibt auch -rightMouseDown:
das Element zu haben, sich auf die Auswahl hinzufügen:
- (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];
}
Wenn Sie es vorziehen, anstatt den Artikel der Auswahl hinzufügen, können Sie überprüfen, ob es bereits bei der Auswahl ist. Wenn dies der Fall ist, ändern Sie die Auswahl nicht. Wenn es nicht ist, ersetzen Sie die Auswahl nur mit dem Element (wodurch es das einzige ausgewählte Element).
Alternativ können Sie ein Kontextmenü für die Objektansichten und nicht für die Sammlungsansicht festlegen. Dann können die Menüelemente entweder auf die Elementansicht oder auf das Objekt der Sammlungsansicht ausgerichtet werden.
Zuletzt könnten Sie die Unterklasse und überschreiben -menuForEvent:
. Sie würden immer noch durch super
aufrufen und das Menü zurückkehren, das es zurückgibt, aber Sie könnten die Gelegenheit nutzen, um das Ereignis und/oder den Artikel an seinem Standort aufzuzeichnen. Um festzustellen, dass, würden tun Sie so etwas wie:
- (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];
}
schön !!! Ich danke dir sehr! –
Das ist viel zu kompliziert. Haben Sie versucht, den Menüausgang Ihrer Sammlungsansicht auf ein Menü aus Ihrer NIB-Datei zu setzen? Legen Sie Ihr Controller-Objekt als Delegat für das Menü fest. Jedes Mal, wenn das Menü aufgerufen wird, aktualisieren Sie Ihr Menü entsprechend der Auswahl in der Sammlungsansicht. – iljawascoding
Ich mag wirklich die 'NSCollectionView'-Unterklasse Ansatz - gibt eine gute Konsistenz des Verhaltens mit' NSTableView'. –