Créez UIActionSheet 'otherButtons' en passant un tableau, pas une varlist


110

J'ai un tableau de chaînes que je souhaite utiliser pour les titres de bouton sur une feuille UIActionSheet. Malheureusement, l'argument otherButtonTitles: dans l'invocation de la méthode prend une liste de chaînes de longueur variable, pas un tableau.

Alors, comment puis-je transmettre ces titres dans la feuille UIActionSheet? La solution de contournement que j'ai vue suggérée est de passer nil dans otherButtonTitles :, puis de spécifier les titres des boutons individuellement en utilisant addButtonWithTitle :. Mais cela pose le problème de déplacer le bouton "Annuler" vers la première position sur la feuille UIActionSheet plutôt que sur la dernière; Je veux que ce soit le dernier.

Existe-t-il un moyen de 1) passer un tableau au lieu d'une liste variable de chaînes, ou bien 2) déplacer le bouton d'annulation vers le bas de la feuille UIActionSheet?

Merci.


Je ne sais pas si cela fonctionnera mais la propriété cancelButtonIndex de UIActionSheet n'est pas en lecture seule. Essayez de le régler et voyez si cela change l'ordre des boutons?
lostInTransit

Réponses:


248

J'ai fait fonctionner cela (il vous suffit de, être d'accord avec un bouton normal, et de l'ajouter simplement après:

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
Cela marche; Merci. Je n'ai pas réalisé que la propriété cancelButtonIndex pouvait être définie. Une chose sur laquelle je pense que nous pouvons tous être d'accord: l'API d'Apple pour cela est nul.
Greg Maletic

11
J'appuie cela! Et 99,99% de leur documentation est également nul. C'est comme essayer d'apprendre la chirurgie cérébrale à partir d'un livre écrit en hébreu archaïque sans connaître cette langue.
Canard

4
J'aurais vraiment aimé pouvoir voter autant de fois encore. Réponse craquante et je ne peux pas croire que je suis resté si longtemps sans le savoir!
mattjgalloway

1
@JimThio cancelButtonn'est pas rouge. Le destructiveButtonest rouge.
Armin

1
Malheureusement, cette solution souffre d'un bogue dans UIActionSheet qui [UIActionSheet addButtonWithTitle]ne semble pas correctement défini firstOtherButtonIndex(qui devrait être utilisé dans leactionSheet:clickedButtonAtIndex: plutôt que dans le codage en dur 0 ou autre chose similaire). Être méchant avec la conversion d'un NSArrayen va_listne semble pas non plus être une excellente solution. :-( Cette API est tellement moche.
Daniel Rinser

78

Une petite note: [actionSheet addButtonWithTitle:] renvoie l'index de ce bouton, donc pour être sûr et "propre", vous pouvez faire ceci:

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

Cela rendra-t-il le bouton d'annulation rouge?
user4951

1
@JimThio Non, le bouton rouge s'appelle "destructiveButton", et il y a une propriété respective destructiveButtonIndexpour cela
Nick

3

Prendre les réponses de Jaba et Nick et les étendre un peu plus loin. Pour incorporer un bouton de destruction dans cette solution:

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

Il existe la version rapide pour la réponse:

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

Pour obtenir la valeur sélectionnée, ajoutez un délégué à votre ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

Et implémentez la méthode "clickedButtonAtIndex"

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

Pour les futurs utilisateurs ... Cela a fonctionné ... mais il est obsolète ... utilisez stackoverflow.com/a/41322537/884674
jeet.chanchawat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.