2012-01-06 11 views
6

Sto tentando di utilizzare UIMenuCnotroller per mostrare un elenco di elementi generati dinamicamente, essi condividono lo stesso metodo di azione e quindi ho bisogno di sapere quale elemento è selezionato nel metodo di azione singola .iOS: Come ottenere l'UIMenuItem selezionato da UIMenuController

Tuttavia, nel metodo di azione - (void)menuItemAction:(id)sender; il mittente è in realtà l'oggetto UIMenuController e non ho trovato alcun metodo di UIMenuController in grado di indicare quale menu è selezionato.

Una soluzione mi viene in mente è quello di generare dinamicamente diversi selettori di azione per gli articoli differenti, e fare alcuni trucchi in forwardInvocation

Ma esiste un modo più semplice?

risposta

1

Ok, ho risolto questo. Implica l'uso di [NSObject forwardInvocation:] ed è un po 'sporco, ma il codice risultante è piuttosto ridotto. Risposto qui: https://stackoverflow.com/a/9874092/790036

+0

Sì alla fine ho preso una soluzione simile. –

2

È possibile utilizzare UIMenuCnotroller come: 1) creazione:

UIMenuController *menuController = [UIMenuController sharedMenuController]; 
     UIMenuItem *open = [[UIMenuItem alloc] initWithTitle:@"Open" action:@selector(open:)]; 
     UIMenuItem *reDownload = [[UIMenuItem alloc] initWithTitle:@"Re-Download" action:@selector(reDownload:)]; 

     [menuController setMenuItems:[NSArray arrayWithObjects:open, reDownload, nil]]; 
     [menuController setTargetRect:cell.frame inView:self.view]; 
     [menuController setMenuVisible:YES animated:YES]; 

     [open release]; 
     [reDownload release]; 

2) Per catturare azioni dovrebbe implementare i metodi seguenti:

- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender 
{ 
    if (selector == @selector(open:)) 
    { 
     return YES; 
    } 

    if (selector == @selector(reDownload:)) 
    { 
     return YES; 
    } 

    return NO; 
} 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

3) e realizzazione di metodi vostra:

- (void) open:(id) sender 
{ 
    [self doSomething]; 
} 

- (void) reDownload:(id) sender 
{ 
[self doSomething]; 
} 

Spero, questo aiuti.

+0

Grazie. Questo è diverso da quello di cui ho bisogno, nel mio caso le due voci di menu vogliono suddividere la stessa azione. Ad esempio, inserisci due nomi di file in due voci di menu, quindi condivideranno lo stesso - (void) open: (id) mittente –

+0

Sì, ma puoi realizzare gli stessi metodi in diversi metodi di azione. In altre parole, ha 2 elementi e 2 azioni differenti. Nel corpo di ciascun actons è possibile definire quali elementi sono stati selezionati e chiamare il metodo di condivisione. – Igor

+0

Prendi semplicemente i file di apertura come esempio, supponi di voler mostrare un menu, ogni elemento di cui mostra un nome di file nella cartella documenti dell'app e tocca per caricare il file. In questo caso non sappiamo quanti file devono essere mostrati fino all'esecuzione, quindi non possiamo assegnare metodi diversi a voci di menu differenti, a meno che non si utilizzi un selettore falso e si faccia leva [NSObject forwardInvocation:] –

1

Un modo più semplice sarebbe quella di utilizzare diverse modalità @selector per ogni voce di menu

Esempi:

UIMenuItem *oneObj = [[UIMenuItem alloc] initWithTitle:@"One" action:@selector(One:)]; 

UIMenuItem *twoObj = [[UIMenuItem alloc] initWithTitle:@"Two" action:@selector(Two:)]; 
+1

Non si devono utilizzare maiuscole in maiuscole o nomi di metodi. –

+0

Ora ho applicato la convenzione di denominazione –