web-dev-qa-db-fra.com

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

J'ai un tableau de chaînes que je veux utiliser pour les titres des boutons 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 passer ces titres dans la feuille UIActionSheet? La solution de contournement que j'ai vue est de passer nil dans otherButtonTitles:, puis de spécifier les titres des boutons individuellement en utilisant addButtonWithTitle :. Mais cela a le problème de déplacer le bouton "Annuler" vers la première position sur la feuille UIActionSheet plutôt que 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 alternativement 2) déplacer le bouton d'annulation au bas de la feuille UIActionSheet?

Merci.

110
Greg Maletic

Je l'ai fait fonctionner (il vous suffit de le faire, soyez d'accord avec un bouton normal et ajoutez-le 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];
247
Jab

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"];
78
Nick

Prendre les réponses de Jaba et Nick et les étendre un peu plus. Pour intégrer 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];
3
Stephen Donnell

Il existe la version Swift 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 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]
}
1
Kevin ABRIOUX