2011-10-15 7 views
7

Ho un foglio di azione con opzioni che variano a seconda delle circostanze. Ci sono abbastanza titoli di pulsanti diversi che mi piacerebbe costruire prima un array di quei titoli di pulsanti, ma non riesco a capire come convertirlo nel formato varargs.Come posso inviare un array di stringhe in un metodo init varargs UIActionSheet?

voglio fare qualcosa di simile:

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]; 

Ora, ovviamente se dovessi avrei potuto fare qualcosa di simile, invece:

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! 

ma che sarebbe orribile. Qualcuno conosce un bel zucchero sintattico per aiutarmi?

EDIT: E 'stato suggerito che uso addButtonWithTitle, che sul volto di esso sembra grande, purtroppo, questo mette i tasti supplementari dopo il pulsante di annullamento, che non è auspicabile.

Credo che questo sia bug con il codice di Apple in quanto la loro documentazione su addButtonWithTitle stati:

// 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. 

requisiti HI (propri Human Interface Guidelines di Apple) favorire il pulsante Annulla in basso tutte le altre opzioni, quindi direi di Apple avvitato. Naturalmente, questo non mi aiuta molto, quindi sono tornato a provare a convertire tra un NSArray e un varargs, che ancora non so come fare.

risposta

18

Si può provare questo

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

Ho pensato che funzionasse, ma ho trovato alcuni problemi con esso, vedi modifica. –

+0

Controllare la modifica. –

+0

Questo ha funzionato. Non sembrava esserci alcun bisogno di fare scherzi con titoli extra. –

4

Perché non fare qualcosa di simile:

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

Ho pensato che funzionasse, ma ho trovato alcuni problemi con esso, vedi modifica. –

5

Una variante di risposta di 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: il metodo di UIActionSheetDelegate dovrebbe controllare contro i titoli dei pulsanti invece di 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 
    } 
} 

Penso dettaglio chiave persone non perdere è l'impostazione del CancelButton nel selettore initWithTitle, invece di aggiungere che dopo tutti gli altri pulsanti e specificando l'aspetto del pulsante Annulla chiamando setCancelButtonIndex :.

0

Ecco un metodo che ho provato che sembra funzionare correttamente. Questo funziona se si desidera aggiungere un pulsante aggiuntivo alla fine dei pulsanti, prima del pulsante "Annulla".

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]; 

sembra essere a posto per aggiungere un 'nullo' extra alla fine della lista pulsanti se la sua condizione (condition4) non è soddisfatta.

Ho testato con successo questo su iOS7.