make how array iphone nsarray uialertsheet

iphone - how - array xcode swift



Use NSArray para especificar otros títulos de canal? (6)

El constructor de UIAlertSheet toma un parámetro otherButtonTitles como una lista varg. Me gustaría especificar los otros títulos de botones de una NSArray en su lugar. es posible?

Es decir, tengo que hacer esto:

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

Pero como estoy generando la lista de botones disponibles en tiempo de ejecución, realmente quiero algo como esto:

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

En este momento, estoy pensando que necesito tener una llamada separada a initWithTitle: para 1 artículo, 2 artículos y 3 artículos. Me gusta esto:

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 }

Eso es mucho código duplicado, pero en realidad podría ser razonable ya que tengo como máximo tres botones. ¿Cómo puedo evitar esto?


En lugar de agregar los botones al inicializar UIActionSheet, intente agregarlos con el método addButtonWithTitle usando un bucle for que pasa por su NSArray.

UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle: titleString delegate: self cancelButtonTitle: cancelString destructiveButtonTitle: nil otherButtonTitles: nil]; for( NSString *title in titles) [alert addButtonWithTitle:title];


Este es un año, pero la solución es bastante simple ... haga lo que @Simon sugirió pero no especifique el título del botón de cancelación, así que:

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

Pero después de agregar sus botones normales, agregue el botón de cancelar, como:

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

Ahora el paso clave es especificar qué botón es el botón de cancelación, como:

alert.cancelButtonIndex = [titles count];

Hacemos [titles count] y no [titles count] - 1 porque estamos agregando el botón de cancelar como extra de la lista de botones en los titles .

Ahora también especifica qué botón desea que sea el botón destructivo (es decir, el botón rojo) especificando el índice de botones destructivo (generalmente ese será el botón [titles count] - 1 ). Además, si mantienes el botón de cancelar para ser el último botón, iOS agregará ese espaciado agradable entre los otros botones y el botón de cancelar.

Todo esto es compatible con iOS 2.0, así que disfruta.


Puedes agregar el botón de cancelar y configurarlo de esta manera:

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


Sé que este es un post antiguo, pero en caso de que alguien más, como yo, esté tratando de resolver esto.

(Esto fue respondido por @kokemomuke. Esto es sobre todo una explicación más detallada. También se basa en @Ephraim y @Simon)

Resulta que la última entrada de addButtonWithTitle: debe ser el botón Cancel . Yo uso

// 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;


addButtonWithTitle: devuelve el índice del botón agregado. Establezca cancelButtonTitle en nil en el método init y después de agregar botones adicionales ejecute esto:

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