2011-12-30 12 views
5

Ci sono molti metodi nella SDK che chiedono una lista di stringhe, terminato da un nullo, per esempio, in UIActionSheet:Costruzione di un nil-terminata lista NSString come NSString *

- (id)initWithTitle:(NSString *)title delegate:(id <UIActionSheetDelegate>)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... 

'otherButtonTitles' in questo caso è un elenco di NSStrings terminato con un nullo. Quello che mi piacerebbe fare è chiamare questo metodo con un NSMutableArray costruito di NSStrings, perché mi piacerebbe creare e ordinare gli argomenti in modo dinamico. Come lo farei? Non sono sicuro di come creare un puntatore nil-terminato su NSStrings in questo caso, e se passarlo funzionerebbe. Devo allocare la memoria manualmente e rilasciarla?

risposta

9

È impossibile convertire qualsiasi array in un elenco variadico.

Tuttavia, per UIActionSheet, si potrebbe aggiungere quei otherButtonTitles dopo la creazione del foglio, utilizzando -addButtonWithTitle:

UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:... 
                 /*etc*/ 
              otherButtonTitles:nil]; 
for (NSString* otherButtonTitle in otherButtonTitlesArray) 
{ 
    [sheet addButtonWithTitle:otherButtonTitle]; 
} 
+4

Questa non è una buona soluzione se si sta impostando un pulsante Annulla sul UIActionSheet. Quando si inizializza il foglio e quindi si aggiunge 'otherButtons' con un ciclo come sopra, il pulsante Annulla finirà per sedersi sopra di essi per qualche motivo. – Arnold

+0

Dovrebbe risolvere il problema. [sheet setCancelButtonIndex: [sheet numberOfButtons] - 1]; – mtwagner

+0

@mtwagner no questo modifica solo lo stile del pulsante - non l'ordine in cui appaiono –

5

ho bisogno di fare un foglio di azione dinamica pure. Quindi ho creato un foglio di azione per lo più vuoto. Aggiunti i miei pulsanti Quindi ha aggiunto il pulsante Annulla e contrassegnato come annullato.

sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:homeName, nil];  
[sheet addButtonWithTitle:otherButton1]; 
[sheet addButtonWithTitle:otherButton2]; 
[sheet addButtonWithTitle:@"Cancel"]; 
[sheet setCancelButtonIndex:[sheet numberOfButtons] - 1]; 
sheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent; 
[sheet showInView:self.view]; 
[sheet release]; 
+0

Questa è una risposta più completa di quella accettata. Grazie! –

1

Sicura POTETE convertire NSArray a va_list. Ad esempio, per utilizzare con NSString

- (id)initWithFormat:(NSString *)format arguments:(va_list)argList 

Ti piace questa:

+ (id)stringWithFormat:(NSString *)format array:(NSArray *)arguments; 
{ 
    NSRange range = NSMakeRange(0, [arguments count]); 
    NSMutableData *data = [NSMutableData dataWithLength:sizeof(id) * [arguments count]]; 
    [arguments getObjects:(__unsafe_unretained id *) data.mutableBytes range:range]; 
    return [[NSString alloc] initWithFormat:format arguments:data.mutableBytes]; 
} 
+0

è bene dire che PUO 'farlo, indicando un diverso caso d'uso; ma puoi farlo per il caso d'uso dato da OP? – Ryan

+0

È il commento per la prima riga di una risposta accettata, quindi il tuo commento non è necessario – LorikMalorik