2009-10-26 13 views
21

Tengo un requisito en una aplicación donde necesito poder agregar otros Títulos de Botón dinámicamente, dependiendo de algunos conmutadores BOOL que un usuario haya especificado en la configuración. Sin embargo, parece que no puedo encontrar la manera de hacerlo en la inicialización de UIActionSheet. Intenté pasar una matriz NSString (NSString [2]) y también una NSArray sin suerte.iPhone SDK - UIActionSheet - Títulos de botón dinámico

Cualquier ayuda aquí es muy apreciada.

Respuesta

58

La forma más sencilla de hacer esto que he encontrado es inicialmente crear su hoja de acción con ningún botón, incluyendo sin cancelar o el botón destructiva:

UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@"Dynamic" 
                 delegate:self 
               cancelButtonTitle:nil 
              destructiveButtonTitle:nil 
               otherButtonTitles:nil]; 

A continuación, añada una carga de botones según sea necesario:

if(buttonX) 
{ 
    [actionSheet addButtonWithTitle:@"Button X"]; 
} 
if(buttonY) 
{ 
    [actionSheet addButtonWithTitle:@"Button Y"]; 
} 
if(buttonZ) 
{ 
    [actionSheet addButtonWithTitle:@"Button Z"]; 
} 

y por último añadir el botón de cancelación al final y establecer el índice botón de cancelación:

[actionSheet addButtonWithTitle:@"Cancel"]; 
actionSheet.cancelButtonIndex = actionSheet.numberOfButtons - 1; 

Por supuesto, puede agregar un botón cancelar y/o un botón destructivo de esta manera.

+1

@harrywynn, probablemente debería marcar esto como la respuesta (o una de ellas al menos). –

+0

Tenga en cuenta que los botones cancelar no aparecen donde UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad. Pasé 20 minutos tratando de descubrir por qué mi botón no se mostraría después de configurar el cancelButtonIndex :) –

6

Puede agregar nuevos botones a la hoja UIActionSheet (ya inicializada) con el método addButtonWithTitle:. También puede crear sus UIButtons personalizados y agregarlos a la vista de UIActionSheet como subViews

+0

He estado usando 'addButtonWithTitle:', luego agrego un botón "Cancelar" como el último, usando 'setCancelButtonIndex' para identificarlo. El problema es cuando tiene más botones de los que caben en la pantalla, cambia a UITableView y los botones se convierten en celdas en la tabla. Si no tiene un botón de Cancelar real especificado a través de 'cancelButtonTitle', no hay forma de cerrar la hoja porque no aparece ningún botón. Tienes que salir de la aplicación en ese punto. ver estas pantallas para ver un ejemplo: http://conceptcache.com/tmp/with_cancel_button.png http://conceptcache.com/tmp/without_cancel_button.png – harrywynn

+0

Eso es extraño - Acabo de crear UIActionSheet con 20 botones (se agregaron todos con attButtonTitle: llamada). La hoja descarta lo correcto y tanto didDismissWithButtonIndex: y clickedButtonAtIndex: se llaman los métodos de delegado ... ¿Qué versión de sdk estás usando? – Vladimir

1

Si necesita tantos botones, cree su propia vista modal y su propio protocolo delegado.

revise la documentación de presentModalViewController:animated y dismissModalViewController:animated:

Cuando el usuario cierra su punto de vista modal, el delegado puede recibir un método de construir, algo así como customActionSheetDidFinish:(int)buttonChosen

2

terminé resolver esto mediante el uso de algunos hilos Nil y una matriz. Coloco los títulos dinámicos que necesito en una matriz, luego recorro y establezco las cadenas de marcador de posición con tantos títulos como sea necesario. Las cadenas de marcador de posición se pasan a otherButtonTitles: en la inicialización de la hoja de acciones. Al ser otherButtonTitles: finalizado por cero, puede pasar tantas cadenas de marcador de posición como sea necesario, ya que el primer marcador de posición nulo terminará el resto.

// button titles  
NSMutableArray *buttons = [[NSMutableArray alloc] init]; 
[buttons addObject:@"Button 1"]; 
[buttons addObject:@"Button 2"]; 

// placeholders 
NSString *button0 = nil, *button1 = nil, *button2 = nil; 

// put together the buttons 
for (int x = 0; x < buttons.count; x++) { 
    switch (x) { 
     case 0: 
      button0 = [buttons objectAtIndex:x]; 
      break; 
     case 1: 
      button1 = [buttons objectAtIndex:x]; 
      break; 
     case 2: 
      button2 = [buttons objectAtIndex:x]; 
      break; 
    } 
} 

// action sheet 
UIActionSheet *option = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:button0, button1, button2, nil]; 

Espero que esto sea útil para los demás que enfrentan un dilema similar.

+0

¿Y qué harías si necesitas 20 o 30 botones? – Vladimir

+0

Bueno, solo necesito un máximo de 5, así que esto funciona para esta aplicación en particular. Esto probablemente no sería práctico si necesitaras 20 o 30. – harrywynn

Cuestiones relacionadas