UIActionSheet buttonIndex valores defectuosos cuando se utilizan más de 6 botones personalizados?

Descubrí un problema extraño al usar UIActionSheet en el iPhone (iOS 4.2). Considere este código:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window addSubview:viewController.view]; [self.window makeKeyAndVisible]; UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"TestSheet" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: nil]; [actionSheet addButtonWithTitle:@"one"]; [actionSheet addButtonWithTitle:@"two"]; [actionSheet addButtonWithTitle:@"three"]; [actionSheet addButtonWithTitle:@"four"]; [actionSheet addButtonWithTitle:@"five"]; [actionSheet addButtonWithTitle:@"six"]; //uncomment next line to see the problem in action //[actionSheet addButtonWithTitle:@"seven"]; [actionSheet showInView:window]; [actionSheet release]; return YES; } - (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { NSLog(@"buttonIndex: %d, cancelButtonIndex: %d, firstOtherButtonIndex: %d", buttonIndex, actionSheet.cancelButtonIndex, actionSheet.firstOtherButtonIndex); } 

Si inicia esta aplicación, la hoja de acciones se comporta como se esperaba. Eso significa que the CancelButton Index es siempre 0, y los índices del button se informan correctamente. 1 para el button "uno", y así sucesivamente. Si comenta en la línea para agregar el séptimo button, la hoja de acciones produce una especie de vista de tabla, con el button cancelar en una línea adicional. Si presiono el button "one" en este caso, la variable buttonindex es 0, pero también lo es the cancelButtonIndex. Es imposible saber si el usuario ha tocado el button "cancelar" o "uno". Eso no parece ser así. ¿Alguien no está de acuerdo? Gracias por tu ayuda.

Me encontré con el mismo problema a pesar de que ya estaba incluyendo el button Cancelar como el último en la hoja de acción y configurando su índice en consecuencia. Mis problemas tenían que ver con el button 'Destructivo'. Después de una investigación, aquí está mi opinión sobre el problema:

  • Una vez que se han agregado los botones N a la hoja de acciones, cambia su layout para colocar el button Destructivo en la parte superior y el button Cancelar en la parte inferior. En el medio hay una vista desplazable que incluye todos los demás botones. Otras fonts indican que se trata de una vista de tabla.

  • N es 7 para la orientación vertical y 5 para la orientación horizontal. N es 9 para la orientación vertical en una pantalla más grande de 4 ". Estos numbers son para todos los botones, incluyendo Cancelar y Destructivo. Para ser más claro, N es el número más grande de botones antes del cambio. Los botones N + 1 hacen que UIActionSheet cambie a vista desplazable

  • No importa dónde en la hoja de acción hayas colocado originalmente los botones Cancelar y Destructivo en la hoja de acción. Una vez que se ha alcanzado el límite, el button Destructivo se mueve a la parte superior y la opción Cancelar se mueve a la parte inferior.

  • El problema es que los índices no se ajustan en consecuencia. Por lo tanto, si no agregaste inicialmente el button Cancelar como último y el Destructivo como el primero, el índice incorrecto se informará en la hoja de acción: clickedButtonAtIndex: como se indicó en el informe inicial.

  • Por lo tanto, si va a tener más de N botones en su hoja de acción, DEBE agregar el button Destructive a la hoja de acción como el primer button de la hoja de acción. DEBE agregar el button Cancelar como el último button agregado a la hoja de acción. Cuando inicialmente construimos la hoja, simplemente dejemos ambas como nulas, como se describe en otra respuesta.

Acabo de tener este problema. Resuélvelo al no configurar el button cancelar inicialmente. Configuré los botones individualmente de esta forma:

  for(int index = 0; index < buttonTotal; index++) { [actionSheet addButtonWithTitle:[NSString stringWithFormat:buttonText, [buttonItems objectAtIndex: index]]]; } [actionSheet addButtonWithTitle:@"Cancel"]; actionSheet.cancelButtonIndex = actionSheet.numberOfButtons; 

Creo que el destructiveButton utiliza el índice cero si lo usa para que los otros botones aumenten de allí, de lo contrario, comenzarán desde 0.

No estoy seguro de estar de acuerdo con la opción de la tabla, ya que por encima de una cierta cantidad, los botones pnetworkingeterminados a una list desplazable.

presentar un error sobre el problema. Incluya un pequeño proyecto de muestra y espere unos meses para recibir noticias de ellos.

Por ahora, puedes configurar tus botones estáticamente en el init

 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"TestSheet" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", nil]; 

funciona sin problemas

1) Haz una instancia de la vista de acción usando

[[UIActionSheet alloc] InitWithTitle: delegate: cancelButtonTitle: destructiveButtonTitle: OtherButtonTitles:]

sin el button cancelar o el button destructivo (ajústelos a cero)

2) Agregue todos los botones de manera normal, usando [myActionSheet addButtonWithTitle:(NSString *)] .

3) Si desea un button especial, agréguelo utilizando el mismo método que en el paso 2, y configure el título para lo que sea ( @"Cancel" , por ejemplo);

4) Ahora establezca la propiedad [myActionSheet setCancelButtonIndex:] en el índice del último button en la [myActionSheet setCancelButtonIndex:] , que fue el button cancelar hecho. Haga lo mismo para un button destructivo. (Estos son -1 de forma pnetworkingeterminada, lo que hace que no se muestren)

  • Tenga en count que un button destructivo siempre aparecerá en la parte superior, y un button de cancelación siempre aparecerá en la parte inferior, que no se puede cambiar.

  • Además, sin duda puede agregar el button cancelar / destructivo en el índice 0, y agregar todos los demás botones después de eso. Sin embargo, ahora el primer índice de sus otros botones es 1, en lugar de cero. Esto puede ser confuso si tiene una matriz que se corresponde con los botones de vista de alerta.

Haz como a continuación:

 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"TestSheet" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles: @"one", @"two", @"three", @"four", @"five", @"six", @"seven", @"eight", nil]; 

Significa que define el button destructiveButtonTitle como destructiveButtonTitle . EVITE usar el button destructivo / cancelar en el otherButtonTitles .