Pergunta

O construtor de UIAlertSheet leva um parâmetro otherButtonTitles como uma lista varg. Eu gostaria de especificar os outros títulos de botão a partir de um NSArray vez. Isso é possível?

i. Eu tenho que fazer isso:

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

Mas desde que eu estou gerando a lista de botões disponíveis em tempo de execução, eu realmente quero algo como isto:

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

Agora, eu estou pensando que eu preciso ter uma chamada separada para initWithTitle: por 1 item, 2 itens e 3 itens. Como esta:

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
}

Isso é um monte de código duplicado, mas pode realmente ser razoável, já que eu tenho no máximo três botões. Como posso evitar isso?

Foi útil?

Solução

Este é um ano de idade, mas a solução é bastante simples ... fazer como @Simon sugerido, mas não especificar uma cancelar título do botão, assim:

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

Mas depois de adicionar seus normais botões, adicionar o botão, como cancelar:

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

[alert addButtonWithTitle:cancelString];

Agora, o passo fundamental é especificar qual botão é o botão, como cancelar:

alert.cancelButtonIndex = [titles count];

Nós fazemos [titles count] e não [titles count] - 1 pois estamos adicionando o botão Cancelar como extra a partir da lista de botões em titles.

Agora você também especificar qual botão você quer ser o botão destrutiva (ou seja, o botão vermelho), especificando o destructiveButtonIndex (tipicamente que será o botão [titles count] - 1). Além disso, se você mantiver o botão de cancelamento de ser o último botão, iOS irá adicionar que o espaçamento agradável entre os outros botões eo botão de cancelamento.

Todos estes é iOS 2.0 compatível assim desfrutar.

Outras dicas

Em vez de adicionar os botões quando você inicializar o UIActionSheet, tente adicioná-los com o método addButtonWithTitle usando um loop for que passa pela sua NSArray.

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

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

addButtonWithTitle: retorna o índice do botão adicionado. Set cancelButtonTitle a zero no método init e depois de adicionar botões adicionais executar este:

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

Você pode adicionar o botão de cancelamento e defini-lo como este:

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

Eu sei que este é um post antigo, mas no caso de alguém, como eu, está tentando descobrir isso.

(Esta foi respondida por @kokemomuke. Isto é principalmente uma explicação mais detalhada. Também com base @Ephraim e @Simon)

Acontece que o LAST entrada de addButtonWithTitle: necessidades para ser o botão Cancel. Eu usaria:

// 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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top