Question

Le constructeur de UIAlertSheet prend un paramètre otherButtonTitles sous forme de liste varg. J'aimerais plutôt spécifier les autres titres de bouton d'un NSArray. Est-ce possible?

i.e. Je dois faire ceci:

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                  delegate: self
                                  cancelButtonTitle: cancelString
                                  destructiveButtonTitle: nil
                                  otherButtonTitles: button1Title, button2Title, nil];

Mais comme je génère la liste des boutons disponibles au moment de l'exécution, je souhaite vraiment quelque chose comme ceci:

id alert = [[UIActionSheet alloc] initWithTitle: titleString
                                       delegate: self
                              cancelButtonTitle: cancelString
                         destructiveButtonTitle: nil
                              otherButtonTitles: otherButtonTitles];

Pour le moment, je pense que je dois passer un appel distinct à initWithTitle: pour 1 élément, 2 éléments et 3 éléments. Comme ceci:

if ( [titles count] == 1 ) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], nil];
} else if ( [titles count] == 2) {
     alert = [[UIActionSheet alloc] initWithTitle: titleString
                                         delegate: self
                                cancelButtonTitle: cancelString
                           destructiveButtonTitle: nil
                                otherButtonTitles: [titles objectAtIndex: 0], [titles objectAtIndex: 1],  nil];
} else {
    // and so on
}

Cela fait beaucoup de code en double, mais cela pourrait en fait être raisonnable puisque j'ai au plus trois boutons. Comment puis-je éviter cela?

Était-ce utile?

La solution

Cela fait un an mais la solution est assez simple ... faites comme le suggère @Simon mais ne spécifiez pas le titre du bouton d'annulation, donc:

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: nil
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

Mais après avoir ajouté vos boutons normaux, ajoutez le bouton annuler, comme suit:

for( NSString *title in titles)  {
    [alert addButtonWithTitle:title]; 
}

[alert addButtonWithTitle:cancelString];

Maintenant, l'étape clé consiste à spécifier quel bouton est le bouton d'annulation, comme suit:

alert.cancelButtonIndex = [titles count];

Nous faisons [nombre de titres] et non pas [nombre de titres] - 1 car nous ajoutons le bouton d'annulation en plus de la liste des boutons de titres .

Vous spécifiez maintenant le bouton que vous voulez utiliser comme bouton destructif (c.-à-d. le bouton rouge) en spécifiant destructiveButtonIndex (généralement, le bouton [title count] - 1 ]. De plus, si vous conservez le bouton Annuler comme dernier bouton, iOS ajoutera cet bel espacement entre les autres boutons et le bouton Annuler.

Toutes ces applications sont compatibles iOS 2.0, alors profitez-en.

Autres conseils

Au lieu d'ajouter les boutons lorsque vous initialisez UIActionSheet, essayez de les ajouter avec la méthode addButtonWithTitle à l'aide d'une boucle for qui traverse votre NSArray.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString
                              delegate: self
                              cancelButtonTitle: cancelString
                              destructiveButtonTitle: nil
                              otherButtonTitles: nil];

for( NSString *title in titles)  
    [alert addButtonWithTitle:title]; 

addButtonWithTitle: renvoie l'index du bouton ajouté. Définissez cancelButtonTitle sur nil dans la méthode init et, après avoir ajouté des boutons supplémentaires, exécutez la procédure suivante:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
- (void)showActionSheetWithButtons:(NSArray *)buttons withTitle:(NSString *)title {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: title 
                                                             delegate: self
                                                    cancelButtonTitle: nil 
                                               destructiveButtonTitle: nil 
                                                    otherButtonTitles: nil];

    for (NSString *title in buttons) {
        [actionSheet addButtonWithTitle: title];
    }

    [actionSheet addButtonWithTitle: @"Cancel"];
    [actionSheet setCancelButtonIndex: [buttons count]];
    [actionSheet showInView:self.view];
}

Vous pouvez ajouter le bouton d'annulation et le définir comme suit:

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

Je sais que ceci est un ancien post, mais au cas où quelqu'un d'autre, comme moi, essaie de comprendre cela.

(@kokemomuke a répondu à cette question. Il s'agit principalement d'une explication plus détaillée. Construisant également sur @Ephraim et @Simon)

Il s'avère que l'entrée LAST de addButtonWithTitle: doit être le bouton Annuler . J'utiliserais:

// All titles EXCLUDING Cancel button
for( NSString *title in titles)  
    [sheet addButtonWithTitle:title];


// The next two line MUST be set correctly: 
// 1. Cancel button must be added as the last entry
// 2. Index of the Cancel button must be set to the last entry

[sheet addButtonWithTitle:@"Cancel"];

sheet.cancelButtonIndex = titles.count - 1;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top