Crie UIActionSheet 'otherButtons' passando em array, não varlist

110

Eu tenho uma matriz de strings que desejo usar para títulos de botão em um UIActionSheet. Infelizmente, o argumento otherButtonTitles: na invocação do método leva uma lista de strings de comprimento variável, não um array.

Então, como posso passar esses títulos para o UIActionSheet? A solução alternativa que vi sugerida é passar nil para otherButtonTitles: e, em seguida, especificar os títulos dos botões individualmente usando addButtonWithTitle :. Mas isso tem o problema de mover o botão "Cancelar" para a primeira posição na UIActionSheet em vez da última; Eu quero que seja o último.

Existe uma maneira de 1) passar um array no lugar de uma lista de variáveis ​​de strings ou, alternativamente, 2) mover o botão de cancelamento para a parte inferior da UIActionSheet?

Obrigado.

Greg Maletic
fonte
não tenho certeza se isso vai funcionar, mas a propriedade cancelButtonIndex de UIActionSheet não é somente leitura. Tente configurá-lo e veja se isso muda a ordem dos botões?
lostInellence

Respostas:

248

Eu fiz isso funcionar (você só precisa estar ok com um botão normal e apenas adicioná-lo após:

NSArray *array = @[@"1st Button",@"2nd Button",@"3rd Button",@"4th Button"];

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Title Here"
                                                             delegate:self
                                                    cancelButtonTitle:nil
                                               destructiveButtonTitle:nil
                                                    otherButtonTitles:nil];

    // ObjC Fast Enumeration
    for (NSString *title in array) {
        [actionSheet addButtonWithTitle:title];
    }

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

    [actionSheet showInView:self.view];
Jab
fonte
19
Isso funciona; obrigado. Não percebi que a propriedade cancelButtonIndex poderia ser definida. Uma coisa que acho que todos concordamos: API da Apple para isso é uma merda.
Greg Maletic,
11
Eu apoio isso! E 99,99% de sua documentação também é uma merda. É como tentar aprender cirurgia cerebral com um livro escrito em hebraico arcaico sem conhecer essa linguagem.
Pato de
4
Eu gostaria muito de poder votar nisso muitas mais vezes. Resmungando e eu não posso acreditar que passei tanto tempo sem saber disso!
mattjgalloway
1
@JimThio cancelButtonnão é vermelho. O destructiveButtoné vermelho.
Armin
1
Infelizmente, esta solução sofre de um bug no UIActionSheet que [UIActionSheet addButtonWithTitle]não parece estar configurado corretamente firstOtherButtonIndex(que deve ser usado no delegado em actionSheet:clickedButtonAtIndex:vez de codificar 0 ou algo semelhante). Ser desagradável ao converter um NSArraypara va_listtambém não parece uma boa solução. :-( Esta API é tão feia.
Daniel Rinser
78

Uma pequena observação: [actionSheet addButtonWithTitle:] retorna o índice desse botão, portanto, para estar seguro e "limpo", você pode fazer o seguinte:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
usuario
fonte
Isso tornará o botão Cancelar vermelho?
user4951
1
@JimThio Não, o botão vermelho chama-se "destructiveButton" e há uma propriedade respectiva destructiveButtonIndexpara ele
Nick,
3

Pegando as respostas de Jaba e Nick e estendendo-as um pouco mais. Para incorporar um botão de destruição a esta solução:

// Create action sheet
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:nil
                                                otherButtonTitles:nil];
// Action Buttons
for (NSString *actionName in actionNames){
    [actionSheet addButtonWithTitle: actionName];
}

// Destruction Button
if (destructiveName.length > 0){
    [actionSheet setDestructiveButtonIndex:[actionSheet addButtonWithTitle: destructiveName]];
}

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

// Present Action Sheet
[actionSheet showInView: self.view];
Stephen Donnell
fonte
1

Esta é a versão rápida para a resposta:

//array with button titles
private var values = ["Value 1", "Value 2", "Value 3"]

//create action sheet
let actionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil)
//for each value in array
for value in values{
    //add a button
    actionSheet.addButtonWithTitle(value as String)
}
//display action sheet
actionSheet.showInView(self.view)

Para obter o valor selecionado, adicione delegado ao seu ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

E implemente o método "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
Kevin ABRIOUX
fonte
Para futuros usuários ... Funcionou ... mas está obsoleto ... use stackoverflow.com/a/41322537/884674
jeet.chanchawat