2012-01-06 14 views
6

Estoy tratando de usar UIMenuCnotroller para mostrar una lista de elementos generados dinámicamente, comparten el mismo método de acción, por lo que necesito saber qué elemento se selecciona en el método de acción única .iOS: Cómo obtener el UIMenuItem seleccionado de UIMenuController

Sin embargo, en el método de acción - (void)menuItemAction:(id)sender; el remitente es realmente el objeto UIMenuController, y no encontré ningún método de UIMenuController que me diga qué elemento de menú está seleccionado.

Una solución que se me ocurre es generar dinámicamente diferentes selectores de acción para diversos artículos, y hacer algunos trucos en forwardInvocation

Pero ¿hay alguna manera más fácil?

Respuesta

1

Bien, he resuelto este. Implica jugar con [NSObject forwardInvocation:] y está un poco sucio, pero el código resultante es bastante mínimo. Respondió aquí: https://stackoverflow.com/a/9874092/790036

+0

Sí, finalmente tomé una solución similar. –

2

Puede utilizar UIMenuCnotroller como: 1) Creación:

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) Para la captura de acciones deberían aplicar los siguientes métodos:

- (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) y realización de los métodos suyo:

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

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

Espero, esto ayuda.

+0

Gracias. Esto es diferente de lo que necesito, en mi caso los dos elementos del menú quieren fragmentar la misma acción. Por ejemplo, ponga dos nombres de archivo en dos elementos de menú, luego compartirán el mismo - (nulo) abrir: (id) remitente –

+0

Sí, pero puede realizar los mismos métodos en diferentes métodos de acciones. En otras palabras, tiene 2 elementos y 2 acciones diferentes. En el cuerpo de cada acto, puede definir qué elementos ha sido seleccionado y el método de compartir llamada. – Igor

+0

Simplemente tome como ejemplo los archivos de apertura, suponga que queremos mostrar un menú, cada elemento del cual muestra un nombre de archivo en la carpeta del documento de la aplicación, y toque que cargará el archivo. En este caso, no sabemos cuántos archivos se deben mostrar hasta que se ejecuten, por lo que no podemos asignar diferentes métodos a diferentes elementos del menú, a menos que use un selector falso y apalanque [NSObject forwardInvocation:] –

1

Una forma más fácil sería utilizar diferentes @selector método para cada elemento de menú

Ejemplos:

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

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

No debe escribir en mayúsculas los nombres de variables o métodos. –

+0

Ahora he aplicado la convención de nomenclatura –

Cuestiones relacionadas