Crea UIActionSheet "otherButtons" passando un array, non un elenco variabili


110

Ho una matrice di stringhe che voglio utilizzare per i titoli dei pulsanti su un UIActionSheet. Sfortunatamente, l'argomento otherButtonTitles: nell'invocazione del metodo accetta un elenco di stringhe di lunghezza variabile, non un array.

Allora come posso trasferire questi titoli nell'UIActionSheet? La soluzione alternativa che ho visto suggerito è di passare nil in otherButtonTitles :, quindi specificare i titoli dei pulsanti individualmente utilizzando addButtonWithTitle :. Ma questo ha il problema di spostare il pulsante "Annulla" nella prima posizione su UIActionSheet piuttosto che nell'ultima; Voglio che sia l'ultimo.

C'è un modo per 1) passare un array al posto di un elenco di stringhe di variabili o, in alternativa, 2) spostare il pulsante Annulla in fondo a UIActionSheet?

Grazie.


non sono sicuro che funzionerà, ma la proprietà cancelButtonIndex di UIActionSheet non è di sola lettura. Prova a impostarlo e vedi se questo cambia l'ordine dei pulsanti?
lostInTransit

Risposte:


248

Devo farlo funzionare (devi solo stare bene con un pulsante normale e aggiungerlo dopo:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

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

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

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

    [actionSheet showInView:self.view];

19
Questo funziona; Grazie. Non sapevo che fosse possibile impostare la proprietà cancelButtonIndex. Una cosa su cui penso possiamo essere tutti d'accordo: l'API di Apple per questo fa schifo.
Greg Maletic

11
Io secondo questo! E anche il 99,99% della loro documentazione fa schifo. È come cercare di imparare la chirurgia cerebrale da un libro scritto in ebraico arcaico senza conoscere quella lingua.
Anatra

4
Spero davvero di poter votare questo molte altre volte. Risposta scoppiettante e non posso credere di aver passato così tanto tempo senza saperlo!
mattjgalloway

1
@JimThio cancelButtonnon è rosso. Il destructiveButtonè rosso.
Armin

1
Purtroppo, questa soluzione soffre di un bug in UIActionSheet che [UIActionSheet addButtonWithTitle]non sembra essere impostato correttamente firstOtherButtonIndex(che dovrebbe essere usato nel delegato actionSheet:clickedButtonAtIndex:invece che nella codifica 0 o in cose simili). Anche diventare sgradevole con la conversione di un NSArrayin va_listnon sembra un'ottima soluzione. :-( Questa API è così dannatamente brutta.
Daniel Rinser,

78

Una piccola nota: [actionSheet addButtonWithTitle:] restituisce l'indice di quel pulsante, quindi per essere sicuro e "pulito" puoi farlo:

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

Questo farà diventare rosso il pulsante Annulla?
user4951

1
@JimThio No, il pulsante rosso si chiama "destructiveButton", e c'è una rispettiva proprietà destructiveButtonIndexper esso
Nick

3

Prendendo le risposte di Jaba e Nick ed estendendole un po 'oltre. Per incorporare un pulsante di distruzione in questa soluzione:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

// Cancel Button
[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle:@"Cancel"]];

// Present Action Sheet
[actionSheet showInView: self.view];

1

C'è la versione rapida per la risposta:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

Per ottenere il valore selezionato, aggiungi delegato al tuo ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

E implementa il metodo "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}

Per gli utenti futuri ... Ha funzionato ... ma è sconsigliato l'uso ... stackoverflow.com/a/41322537/884674
jeet.chanchawat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.