Un approccio che ho utilizzato è di non provare ad applicare le azioni del menu contestuale all'elemento specifico su cui è stato fatto clic ma agli elementi selezionati. E faccio in modo che l'elemento cliccato si aggiunga alla selezione.
Ho usato una vista personalizzata per la vista della collezione. La classe di visualizzazione personalizzata ha una presa, item
, nell'elemento di visualizzazione raccolta proprietario, che connetto in NIB. Esso sovrascrive anche -rightMouseDown:
di avere l'elemento stesso aggiungere alla selezione:
- (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];
}
Se si preferisce, invece di aggiungere l'articolo alla selezione, è possibile controllare se è già nella selezione. Se lo è, non modificare la selezione. In caso contrario, sostituire la selezione con solo l'elemento (rendendolo l'unico elemento selezionato).
In alternativa, è possibile impostare un menu contestuale sulle viste di articolo anziché sulla vista di raccolta. Quindi, le voci del menu potrebbero scegliere come target la vista oggetto o la vista della raccolta.
Infine, è possibile creare sottoclasse NSCollectionView
e ignorare -menuForEvent:
. Dovresti comunque chiamare fino al super
e restituire il menu restituito, ma potresti cogliere l'opportunità per registrare l'evento e/o l'articolo nella sua posizione. Per determinare che, devi fare qualcosa di simile:
- (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];
}
fonte
2014-10-01 05:49:48
bellissimo !!! Grazie mille! –
Questo è troppo complicato. Hai provato a impostare l'uscita menu della tua vista raccolta su un menu dal file pennino? Imposta l'oggetto controller come delegato per il menu. Ogni volta che si richiama il menu, aggiornare il menu in base alla selezione nella vista raccolta. – iljawascoding
Mi piace molto l'approccio sottoclasse 'NSCollectionView' - fornisce una buona coerenza di comportamento con' NSTableView'. –