Utilisez NSArray pour spécifier otherButtonTitles?
-
05-07-2019 - |
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?
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;