54 votes

Utilisez NSArray pour spécifier otherButtonTitles?

UIAlertSheet du constructeur prend un otherButtonTitles paramètre comme varg liste. J'aimerais préciser le bouton d'autres titres à partir d'un NSArray à la place. Est-ce possible?

c'est à dire que j'ai à faire ceci:

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

Mais depuis que je suis de la génération de la liste des boutons disponibles au moment de l'exécution, je tiens vraiment à quelque chose comme ceci:

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

Maintenant, je pense que j'ai besoin d'avoir un autre appel à l' initWithTitle: pour 1 point, 2 points 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
}

C'est beaucoup de code en double, mais il pourrait effectivement être raisonnable depuis que j'ai tout au plus trois boutons. Comment puis-je éviter cela?

72voto

Ephraim Points 1661

C'est d'un an, mais la solution est assez simple ... faites comme @Simon l'a suggéré, mais ne spécifiez pas un bouton annuler titre, donc:

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

Mais après l'ajout de votre normal boutons, ajouter le bouton annuler, comme:

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

[alert addButtonWithTitle:cancelString];

Maintenant, l'étape clé est de spécifier quel bouton est le bouton annuler, comme:

sheet.cancelButtonIndex = [titles count];

Nous n' [titles count] et pas [titles count] - 1 parce que nous sommes en ajoutant le bouton annuler supplémentaire à partir de la liste des boutons en titles.

Vous pouvez désormais également spécifier le bouton sur lequel vous voulez être le destructeur bouton (le bouton rouge) en spécifiant le destructiveButtonIndex (habituellement qui sera le [titles count] - 1 bouton). Aussi, si vous gardez le bouton annuler pour être le dernier bouton, iOS va ajouter une belle espacement entre les boutons et le bouton annuler.

L'ensemble de ces est iOS 2.0 compatible alors profitez-en.

52voto

Simon Points 1111

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 parcourt votre NSArray.

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

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

6voto

Henrik Lineholm Points 54

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

4voto

kokemomuke Points 184
- (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];
}

2voto

Ferran Maylinch Points 394

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

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

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