110 votes

Créer UIActionSheet 'otherButtons' en passant un tableau et non une liste de variables.

Je dispose d'un tableau de chaînes de caractères que je souhaite utiliser pour les titres des boutons d'une UIActionSheet. Malheureusement, l'argument otherButtonTitles : de l'invocation de la méthode prend une liste de chaînes de longueur variable, et non un tableau.

Alors comment puis-je passer ces titres dans la UIActionSheet ? La solution que j'ai vue suggérer 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" à la première position sur la UIActionSheet plutôt qu'à la dernière ; je veux qu'il soit le dernier.

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

Merci.

0 votes

Je ne sais pas si cela va fonctionner, mais la propriété cancelButtonIndex de UIActionSheet n'est pas en lecture seule. Essayez de la définir et voyez si cela change l'ordre des boutons ?

249voto

Jaba Points 3963

J'ai réussi à faire en sorte que cela fonctionne (il suffit d'être d'accord avec un bouton ordinaire et de l'ajouter 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 votes

Cela fonctionne ; merci. Je n'avais pas réalisé que la propriété cancelButtonIndex pouvait être définie. Une chose sur laquelle je pense que nous sommes tous d'accord : L'API d'Apple pour ça craint.

11 votes

Je suis d'accord avec ça ! Et 99,99% de leur documentation est également nulle. C'est comme essayer d'apprendre la chirurgie du cerveau à partir d'un livre écrit en hébreu archaïque sans connaître cette langue.

4 votes

J'aimerais vraiment pouvoir voter plus souvent. Réponse géniale et je n'arrive pas à croire que j'ai passé autant de temps sans le savoir !

78voto

Nick Points 1868

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

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

0 votes

Le bouton d'annulation deviendra-t-il rouge ?

1 votes

@JimThio Non, le bouton rouge est appelé "destructiveButton", et il y a une propriété respective destructiveButtonIndex pour elle

3voto

Stephen Donnell Points 118

En prenant les réponses de Jaba et Nick et en les élargissant un peu plus. 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];

2voto

Kevin ABRIOUX Points 6237

Il y a 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]
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X