2011-10-15 15 views
7

Tengo una hoja de acción con opciones que varían según las circunstancias. Hay suficientes títulos de botones diferentes que me gustaría construir una serie de esos títulos de botón en primer lugar, pero no puedo averiguar cómo convertir eso en el formato varargs.¿Cómo puedo enviar una matriz de cadenas en un método de inicio varargs de UIActionSheet?

yo a querer hacer algo como esto:

NSMutableArray *buttonTitles = [NSMutableArray array]; 
if (condition1) { 
    [buttonTitles addObject: @"Do action 1"]; 
} 
if (condition2) { 
    [buttonTitles addObject: @"Do action 2"]; 
} 
if (condition3) { 
    [buttonTitles addObject: @"Do action 3"]; 
} 
if (condition4) { 
    [buttonTitles addObject: @"Do action 4"]; 
} 
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: buttonTitles] autorelease]; 

Ahora, evidentemente, si tuviera que yo podría hacer algo como esto en su lugar:

UIActionSheet *actionSheet = nil; 
if (condition1 && condition2 && condition3 && condition4) { 
    actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", @"Do action 4", nil] autorelease];  
} else if (condition1 && condition2 && condition3 && !condition4) { 
    actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: @"Cancel" destructiveButtonTitle: nil otherButtonTitles: @"Do action1", @"Do action2", @"Do action3", nil] autorelease];  
} 
// else ... 
// about 14 other cases! 

Pero eso sería horrible. ¿Alguien sabe un buen azúcar sintáctico para ayudarme?

EDIT: Se ha sugerido que utilizo addButtonWithTitle, que en la cara de ella se ve muy bien, por desgracia, esto pone los botones adicionales después de que el botón de cancelación, lo cual no es deseable.

Creo que esto es error con el código de Apple, ya que su documentación sobre addButtonWithTitle estados:

// adds a button with the title. returns the index (0 based) of where it was added. buttons are displayed in the order added except for the 
// destructive and cancel button which will be positioned based on HI requirements. buttons cannot be customized. 

requisitos HI (propios Human Interface Guidelines de Apple) favorecen el botón Cancelar debajo de todas las otras opciones, así que diría de Apple jodido. Por supuesto, eso realmente no me ayuda, así que volví a intentar convertir un NSArray y un varargs, que todavía no sé cómo hacer.

Respuesta

18

Puede probar este

NSMutableArray *buttonTitles = [NSMutableArray array]; 
if (condition1) { 
    [buttonTitles addObject: @"Do action 1"]; 
} 
if (condition2) { 
    [buttonTitles addObject: @"Do action 2"]; 
} 
if (condition3) { 
    [buttonTitles addObject: @"Do action 3"]; 
} 
if (condition4) { 
    [buttonTitles addObject: @"Do action 4"]; 
} 
[buttonTitles addObject: @"Cancel"]; 
UIActionSheet *actionSheet = [[[UIActionSheet alloc] initWithTitle: nil delegate: self cancelButtonTitle: nil destructiveButtonTitle: nil otherButtonTitles: nil] autorelease]; 

for (NSString *title in buttonTitles) { 
    [actionSheet addButtonWithTitle: title]; 
} 

[actionSheet setCancelButtonIndex: [buttonTitles count] - 1]; 
+0

Pensé que esto funcionaba, pero encontré algunos problemas con él, ver edición. –

+0

Por favor, verifique la edición. –

+0

Esto funcionó. Sin embargo, no parecía haber ninguna necesidad de meterse con ningún título extra. –

4

¿Por qué no hacer algo como esto:

for (Nstring *button in buttonTitles) 
    [actionSheet addButtonWithTitle:button]; 
+0

Pensé que esto funcionó, pero encontré algunos problemas con él, ver edición. –

5

Una variación en la respuesta de Himanshu:

UIActionSheet * as = [[UIActionSheet alloc] initWithTitle:@"Share" 
               delegate:self 
             cancelButtonTitle:nil /* don't set Cancel title here! */ 
            destructiveButtonTitle:nil 
             otherButtonTitles:nil]; 
int cancelButtonIndex = 0; // will remain 0 if no other buttons besides "Cancel" 
if (canShareBySMS) 
{ 
    [as addButtonWithTitle:kSMSButtonText]; 
    cancelButtonIndex++; 
} 
if (canShareByMail) 
{ 
    [as addButtonWithTitle:kEmailButtonText]; 
    cancelButtonIndex++; 
} 
/* etc. */ 

// after all other buttons have been added, include Cancel 
[as addButtonWithTitle:@"Cancel"]; 
[as setCancelButtonIndex:cancelButtonIndex]; 

[as showInView:self.sharingViewController.view]; 
[as release]; 

Nota: el método de UIActionSheetDelegate debe comprobar contra títulos de botones en vez de buttonIndex:

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kSMSButtonText]) { 
    //share via sms 
    }else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:kEmailButtonText]) { 
    //share via mail 
    } 
} 

creo que la gente se pierda detalle clave es establecer el CancelButton en el selector initWithTitle, en lugar de añadir que después de todos los otros botones y especificar el aspecto del botón de cancelación llamando setCancelButtonIndex :.

0

Aquí hay un método que probé que parece funcionar bien. Esto funciona si desea agregar un botón adicional al final de los botones, antes del botón "cancelar".

NSString * optionalButton = nil; 
if (condition4) { 
    optionalButton = @"Some Additional Option"; 
} 

UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"Some Title" 
                  delegate:self 
               cancelButtonTitle:@"Cancel" 
              destructiveButtonTitle:nil 
               otherButtonTitles:@"Button 1",@"Button 2",@"Button 3",optionalButton, nil]; 


[actionSheet showInView:self.view]; 

Parece estar bien para añadir un 'nil' adicional al final de la lista de botones si no se cumple su condición (condition4).

He probado con éxito esto en iOS7.

Cuestiones relacionadas