Use NSArray para especificar otherButtonTitles?
-
05-07-2019 - |
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?
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;