Domanda

Il costruttore di UIAlertSheet accetta un parametro otherButtonTitles come elenco Varg. Vorrei invece specificare gli altri titoli dei pulsanti da un NSArray. È possibile?

vale a dire. Devo fare questo:

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

Ma dal momento che sto generando l'elenco dei pulsanti disponibili in fase di esecuzione, voglio davvero qualcosa del genere:

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

In questo momento, sto pensando che devo avere una chiamata separata per initWithTitle: per 1 oggetto, 2 oggetti e 3 oggetti. In questo modo:

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
}

È un sacco di codice duplicato, ma in realtà potrebbe essere ragionevole dato che ho al massimo tre pulsanti. Come posso evitarlo?

È stato utile?

Soluzione

È vecchio di un anno ma la soluzione è piuttosto semplice ... fai come suggerito da @Simon ma non specifica il titolo di un pulsante Annulla, quindi:

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

Ma dopo aver aggiunto i normali pulsanti, aggiungi il pulsante Annulla, come:

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

[alert addButtonWithTitle:cancelString];

Ora il passaggio chiave è specificare quale pulsante è il pulsante Annulla, come:

alert.cancelButtonIndex = [titles count];

Facciamo [conta titoli] e non [conta titoli] - 1 perché stiamo aggiungendo il pulsante Annulla come extra dall'elenco dei pulsanti in titoli .

Ora specifichi anche quale pulsante vuoi essere il pulsante distruttivo (ovvero il pulsante rosso) specificando il distruttivo ButtonIndex (in genere si tratta del pulsante [count count] - 1 ). Inoltre, se mantieni il pulsante Annulla come ultimo pulsante, iOS aggiungerà quella bella spaziatura tra gli altri pulsanti e il pulsante Annulla.

Tutti questi sono compatibili con iOS 2.0, quindi divertiti.

Altri suggerimenti

Invece di aggiungere i pulsanti quando si inizializza UIActionSheet, provare ad aggiungerli con il metodo addButtonWithTitle usando un ciclo for che attraversa NSArray.

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

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

addButtonWithTitle: restituisce l'indice del pulsante aggiunto. Imposta cancelButtonTitle su zero nel metodo init e dopo aver aggiunto altri pulsanti esegui questo:

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

Puoi aggiungere il pulsante Annulla e impostarlo in questo modo:

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

So che questo è un vecchio post, ma nel caso in cui qualcun altro, come me, stia cercando di capirlo.

(Questa WAS ha risposto a @kokemomuke. Questa è principalmente una spiegazione più dettagliata. Basandosi anche su @Ephraim e @Simon)

Risulta la voce ULTIMO di addButtonWithTitle: deve essere il pulsante Annulla . Vorrei usare:

// 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top