Cree UIActionSheet 'otherButtons' pasando una matriz, no varlist

110

Tengo una serie de cadenas que quiero usar para los títulos de los botones en una UIActionSheet. Desafortunadamente, el argumento otherButtonTitles: en la invocación del método toma una lista de cadenas de longitud variable, no una matriz.

Entonces, ¿cómo puedo pasar estos títulos a UIActionSheet? La solución alternativa que he visto sugerida es pasar nil a otherButtonTitles :, luego especifique los títulos de los botones individualmente usando addButtonWithTitle :. Pero esto tiene el problema de mover el botón "Cancelar" a la primera posición en UIActionSheet en lugar de la última; Quiero que sea el último.

¿Hay alguna manera de 1) pasar una matriz en lugar de una lista variable de cadenas, o alternativamente 2) mover el botón cancelar a la parte inferior de UIActionSheet?

Gracias.

Greg Maletic
fuente
No estoy seguro de si esto funcionará, pero la propiedad cancelButtonIndex de UIActionSheet no es de solo lectura. Intente configurarlo y vea si eso cambia el orden de los botones.
lostInTransit

Respuestas:

248

Conseguí que esto funcionara (solo necesitas hacerlo, estar bien con un botón normal y solo agregarlo después de:

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];
Pinchazo
fuente
19
Esto funciona; Gracias. No me di cuenta de que se podía establecer la propiedad cancelButtonIndex. Una cosa en la que creo que todos podemos estar de acuerdo: la API de Apple para esto apesta.
Greg Maletic
11
¡Secundo esto! Y el 99,99% de su documentación también apesta. Es como intentar aprender cirugía cerebral de un libro escrito en hebreo arcaico sin conocer ese idioma.
Duck
4
Ojalá pudiera votar a favor de esto muchas veces más. ¡Respuesta de craqueo y no puedo creer que haya pasado tanto tiempo sin saber sobre esto!
mattjgalloway
1
@JimThio cancelButtonno es rojo. El destructiveButtones rojo.
Armin
1
Lamentablemente, esta solución tiene un error en UIActionSheet que [UIActionSheet addButtonWithTitle]parece no configurarse correctamente firstOtherButtonIndex(que debería usarse en el delegado en actionSheet:clickedButtonAtIndex:lugar de codificar 0 o cosas similares). Ponerse desagradable con la conversión de un NSArraya va_listtampoco parece una gran solución. :-( Esta API es muy fea.
Daniel Rinser
78

Una pequeña nota: [actionSheet addButtonWithTitle:] devuelve el índice de ese botón, por lo que para estar seguro y "limpio" puede hacer esto:

actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle:@"Cancel"];
Mella
fuente
¿Eso hará que el botón de cancelar se vuelva rojo?
user4951
1
@JimThio No, el botón rojo se llama "destructiveButton", y hay una propiedad respectiva destructiveButtonIndexpara ello
Nick
3

Tomando las respuestas de Jaba y Nick y extendiéndolas un poco más. Para incorporar un botón de destrucción en esta solución:

// 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
fuente
1

Existe la versión rápida para la respuesta:

//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 obtener el valor seleccionado, agregue delegado a su ViewController:

class MyViewController: UIViewController, UIActionSheetDelegate

E implementar el método "clickedButtonAtIndex"

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) {
    let selectedValue : String = values[buttonIndex]
}
Kevin ABRIOUX
fuente
Para usuarios futuros ... Funcionó ... pero está en desuso ... use stackoverflow.com/a/41322537/884674
jeet.chanchawat