2009-08-11 5 views
9

Je suis sous-classé UIActionSheet, et dans la méthode -init, je dois ajouter les boutons individuellement après avoir appelé le super init (ne peut pas passer un var_args).UIActionSheet addButtonWithTitle: ne pas ajouter des boutons dans l'ordre

En ce moment, il ressemble à ceci:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:cancel destructiveButtonTile:destroy otherButtonTitles:firstButton,nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
    } 
    va_end(argList); 
    } 
} 
return self; 

Cependant, mon utilisation spécifique dans ce cas n'a pas de bouton destructeur, un bouton d'annulation, et quatre autres boutons. Quand il apparaît, l'ordre est tout, montrant comme

Button1
Annuler
Bouton2
Button3

Comme ils ont été simplement ajoutées à la fin de la liste, ce qui est logique; Cependant, je ne veux pas qu'il ressemble à ceci; Alors qu'est-ce que je fais? Est-il, en fait, un moyen de sous-classer UIActionSheet correctement et de faire ce travail?

Répondre

21

Vous pouvez simplement les ajouter dans le bon ordre, puis régler manuellement les cancelButtonIndex et destructiveButtonIndex.

Pour votre exemple de code:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    int idx = 0; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
     idx++; 
    } 
    va_end(argList); 
    [self addButtonWithTitle:cancel]; 
    [self addButtonWithTitle:destroy]; 
    self.cancelButtonIndex = idx++; 
    self.destructiveButtonIndex = idx++; 
    } 
} 
return self; 
+1

Ah, ça le rend plus facile. Je pensais que ceux-ci étaient en lecture seule –

+4

Belle réponse, mais le compteur est en réalité inutile. addButtonWithTitle: retourne l'index auquel il a été ajouté. –

8

La réponse de Ben Dov Aviad est correct, mais l'indice de bouton compteur n'est pas nécessaire pour définir l'index pour les détruire et annuler les indices. La addButtonWithTitle: méthode retourne l'index du nouveau bouton utilisé pour que nous puissions utiliser cette valeur tout de suite comme ceci:

if (self = [super initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTile:nil otherButtonTitles:nil]) { 
    if (firstButton) { 
    id buttonTitle; 
    va_list argList; 
    va_start(argList, firstButtton); 
    while (buttonTitle = va_arg(argList, id)) { 
     [self addButtonWithTitle:buttonTitle] 
    } 
    va_end(argList); 
    self.cancelButtonIndex = [self addButtonWithTitle:cancel]; 
    self.destructiveButtonIndex = [self addButtonWithTitle:destroy]; 
    } 
} 
return self; 
+0

Je pense que votre bouton détruire n'est pas au bon endroit. Cela devrait être au sommet. – lhunath

3

Les réponses précédentes provoquent le bouton destructeur pour être placé au fond, ce qui est non conforme le HIG, et qui est également très déroutant pour l'utilisateur. Le bouton destructeur devrait être en haut, l'annuler en bas et les autres au milieu.

Les commandes suivantes les correctement:

sheetView   = [[UIActionSheet alloc] initWithTitle:title delegate:self 
             cancelButtonTitle:nil destructiveButtonTitle:destructiveTitle otherButtonTitles:firstOtherTitle, nil]; 
if (otherTitlesList) { 
    for (NSString *otherTitle; (otherTitle = va_arg(otherTitlesList, id));) 
     [sheetView addButtonWithTitle:otherTitle]; 
    va_end(otherTitlesList); 
} 
if (cancelTitle) 
    sheetView.cancelButtonIndex  = [sheetView addButtonWithTitle:cancelTitle]; 

Affichez https://github.com/Lyndir/Pearl/blob/master/Pearl-UIKit/PearlSheet.m pour une mise en œuvre (une enveloppe UIActionSheet avec une API à base de blocs).

Questions connexes