Come si aggiunge la possibilità di fare clic con il tasto destro su una riga in un NSOutlineView in modo da poter eliminare un oggetto o qualche altra attività. (es. come quando fai clic destro su una cartella nell'app Apple Mail)Come si aggiunge il menu sensibile al contesto a NSOutlineView (ad es. Menu di scelta rapida)
Penso di essere a metà strada, ho una sottoclasse di NSOutlineView che mi permette di catturare il tasto destro del mouse e visualizzare un menu contestuale basato sul riga selezionata anziché la riga su cui il mouse fa clic.
@implementation NSContextOutlineView
- (NSMenu *)defaultMenu {
if([self selectedRow] < 0) return nil;
NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@"Model browser context menu"] autorelease];
[theMenu insertItemWithTitle:@"Add package" action:@selector(addSite:) keyEquivalent:@"" atIndex:0];
NSString* deleteItem = [NSString stringWithFormat: @"Remove '%i'", [self selectedRow]];
[theMenu insertItemWithTitle: deleteItem action:@selector(removeSite:) keyEquivalent:@"" atIndex:1];
return theMenu;
}
- (NSMenu *)menuForEvent:(NSEvent *)theEvent {
return [self defaultMenu];
}
@end
Scusate se la risposta è ovvia, non posso trovare alcun aiuto su questo in linea o nella documentazione.
Grazie revocatorie per la risposta, che mi portano a utilizzare questo:
- (NSMenu *)menuForEvent:(NSEvent *)theEvent {
NSPoint pt = [self convertPoint:[theEvent locationInWindow] fromView:nil];
id item = [self itemAtRow: [self rowAtPoint:pt]];
return [self defaultMenuFor: item];
}
Senza eseguirlo, sembra che dovrebbe funzionare bene. Non è così? In caso contrario, quale problema stai riscontrando? –
Inoltre, non utilizzare il prefisso NS nelle proprie classi. Se Apple aggiunge una classe NSContextOutlineView a una versione futura di Cocoa, la loro classe e la tua si scontreranno e probabilmente l'app non verrà eseguita. –
Penso che il problema con il codice postato sia che utilizzerà la riga selezionata e non la riga su cui è stato eseguito il tasto destro/ctrl-clic. Potrebbe essere o non essere la riga selezionata. – VoidPointer