web-dev-qa-db-fra.com

Utilisez Nsarray pour spécifier les autresButtonTillons?

Le constructeur de UIALERTSHEET prend un paramètre d'autresButtTontities en tant que liste VARG. Je souhaite spécifier les autres titres de boutons d'un Nsarray à la place. Est-ce possible?

dire que je dois faire ceci:

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

Mais puisque je crée la liste des boutons disponibles à l'exécution, je veux vraiment quelque chose comme ceci:

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

En ce moment, je pense que je dois avoir un appel séparé à initWithTitle: pour 1 article, 2 éléments et 3 éléments. Comme ça:

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 cela pourrait être raisonnable car j'ai au maximum trois boutons. Comment puis-je éviter ça?

54
Steven Fisher

C'est un an, mais la solution est assez simple ... faire comme @simon suggéré mais ne spécifie pas de titre de 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:

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

[alert addButtonWithTitle:cancelString];

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

alert.cancelButtonIndex = [titles count];

Nous faisons [titles count] et pas [titles count] - 1 Parce que nous ajoutons le bouton Annuler comme supplémentaire de la liste des boutons de titles.

Vous spécifiez maintenant également quel bouton vous voulez être le bouton destructeur (c'est-à-dire le bouton rouge) en spécifiant le destructeurbuttonindex (typiquement qui sera le [titles count] - 1 bouton). De plus, si vous conservez le bouton Annuler pour être le dernier bouton, iOS ajoutera ce joli espacement entre les autres boutons et le bouton Annuler.

Tout cela est IOS 2.0 Compatible, alors profitez-en.

72
Ephraim

Au lieu d'ajouter les boutons lorsque vous initialisez la fiche uactionnelle, essayez de les ajouter de la méthode AddButtonWithTle à l'aide d'une boucle pour votre Nsarray.

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

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

addButtonWithTtitle: Retourne l'index du bouton ajouté. Définissez AnnulerButTontiTle à NIL dans la méthode init et après avoir ajouté des boutons supplémentaires, exécutez ceci:

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

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

[actionSheet setCancelButtonIndex: [actionSheet addButtonWithTitle: @"Cancel"]];
2
Ferran Maylinch

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

((Ceci a été répondu par @kokemomuke. C'est principalement une explication plus détaillée. Égaissant également sur @ephraim et @simon)

Il s'avère le [~ # ~] dernier [~ # ~ ~] Entrée de AddButtonWithTtitle: doit être le bouton Cancel. 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;
1
bauerMusic