2008-11-24 13 views
7

Tengo dos UIActionSheets y estoy pensando que las controlaré con un delegado (el UIViewController que las crea). El delegado capturará una llamada a actionSheet e intentará determinar cuál de los dos lanzó el evento.Usando un delegado para administrar dos UIActionSheets

Traté de conseguir el título de la modalView diferenciar, pero parece ser válido ...

caso de este trabajo?

Si no, ¿hay alguna otra manera de distinguir qué UIActionSheet hizo el evento?

¿O necesito crear dos clases diferentes que serán delegados separados para cada UIActionSheet?

Gracias de antemano.

Respuesta

44

Creo que se necesita la etiqueta propiedad del UIActionSheet.

Algo así como:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle ... ]; 
actionSheet.tag = 10; 
[actionSheet showInView:self.view]; 

Luego, en su delegado:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    switch (actionSheet.tag) { 
    case 10: 
     ... 
    } 
} 

etiqueta es una propiedad de UIView y se puede ajustar en el Interface Builder para los componentes que aparecen allí también. Muy útil, aunque nunca lo he usado en este contexto.

+1

Stephen me golpeó al golpe. Esta es exactamente la técnica que uso. La propiedad de etiqueta es bastante útil para casos como este. También lo uso cuando genero IU dinámicamente donde el número de subvistas se determina en tiempo de ejecución. – Jablair

+0

Excelente, esto funcionó muy bien. ¡Gracias! –

+0

"etiqueta" es un consejo fantástico, magnífico. – Fattie

9

Los métodos de delegado en Cocoa incluyen el objeto de envío para este fin. Mantenga una referencia a cada una de sus hojas de acción como una variable de instancia en su clase de controlador, y puede comparar esto con el parámetro actionSheet en sus métodos de delegado para decidir qué acciones necesita realizar.

Usar la propiedad de etiqueta de la vista funcionaría, pero sería más fácil mantener una referencia. La propiedad de la etiqueta está destinada a ayudarlo a encontrar una vista si está mirando a través de una jerarquía de sub-vistas y no tiene una referencia al objeto que necesita.

6

Debe utilizar el puntero actionSheet pasado al método del delegado como dijo Marc. Por ejemplo:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if(actionSheet == myDoSomethingActionSheet) { 
     if(buttonIndex == 0) { 
      [self doThingA]; 
      return; 
     } 
     if(buttonIndex == 1) { 
      [self doThingB]; 
      return; 
     } 
    } 
    if(actionSheet == myOtherActionSheet) { 
     if(buttonIndex == 3) { 
      [self doImportantThing]; 
      return; 
     } 
    } 
} 
Cuestiones relacionadas