2011-03-10 10 views
25

He descubierto un problema extraño al usar UIActionSheet en el iPhone (iOS 4.2). Considere este código:UIActionSheet button ¿Los valores de índice son incorrectos cuando se utilizan más de 6 botones personalizados?

- (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 se inicia esta aplicación, el actionsheet se comporta como se esperaba. Eso significa que cancelButtonIndex siempre es 0 y los índices de los botones se informan correctamente. 1 para el botón "uno" y así sucesivamente. Si hace un comentario en la línea para agregar el séptimo botón, la hoja de acciones produce una especie de tabla vista, con el botón cancelar en una línea adicional. Si presiono el botón "uno" en este caso, la variable buttonindex es 0, pero también lo es el cancelButtonIndex. Es imposible saber si el usuario ha tocado el botón "cancelar" o "uno". Eso no parece que debería ser de esta manera. ¿Alguien está en desacuerdo? Gracias por tu ayuda.

+0

Seis botones en la hoja de acción? De Verdad? Sugiero usar una tabla para las opciones ... – Eimantas

+9

Bueno, ¿de qué sirve tener una hoja de acción que puede manejar más de 6 botones en una vista de desplazamiento si no se supone que debes usarla? – huesforalice

+0

Tuve el mismo problema, aparentemente es un error –

Respuesta

34

Me encontré con el mismo problema a pesar de que ya estaba incluyendo el botón Cancelar como el último en la hoja de acción y estableciendo su índice en consecuencia. Mis problemas tenían que ver con el botón 'Destructive'. Después de algunas investigaciones, aquí es mi opinión sobre el problema:

  • después de n botones se han añadido a la actionsheet, la aplicación cambiará su diseño para poner el botón destructivo en la parte superior y el botón Cancelar en la parte inferior. En el medio hay una vista desplazable que incluye todos los otros botones. Otras fuentes indican que esta es una vista de tabla.

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

  • no importa donde en la hoja de acción que había puesto inicialmente el Cancelar y botones destructivas dentro de la hoja de la acción. Una vez que se ha alcanzado el límite, el botón destructivo se mueve a la parte superior y la anulación se se trasladó a la parte inferior.

  • el problema es que los índices no se ajustan en consecuencia. por lo tanto, si no inicialmente agrega el Cancelar como el último botón y el destructivo como la primera, se informó que el índice incorrecto en actionSheet : clicke dButtonAtIndex: como declaró el informe inicial.

  • lo tanto, si va a tener más de N botones en su hoja de acción que hay que añadir el botón destructivo para el actionSheet que el botón primera a la hoja de acción. DEBE agregar el botón Cancelar como el último botón agregado a la hoja de acción. Cuando se construye inicialmente la hoja simplemente deje ambos como nulos, como se describe en otra respuesta.

+1

Esta es la respuesta correcta en realidad, no la indicada anteriormente. Gracias a Rich por publicar.Para los lectores, tome nota de la cuarta viñeta con respecto al orden de los botones. – Christopher

+5

Esto es un comportamiento tan ridículo. A menudo me pregunto por qué Apple toma ciertas decisiones. Este es uno de ellos. Gracias por el consejo. – stephenmuss

13

Acabo de tener este problema. Resuélvelo no configurando el botón cancelar inicialmente. Me puse los botones de forma individual o menos así:

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 índice de cero es usada por el destructiveButton si lo usa por lo que los otros botones se incrementará a partir de ahí, de lo contrario van a empezar desde 0.

No estoy seguro de que esté de acuerdo con la opción de la tabla, ya que, por encima de cierta cantidad, los botones predeterminados son una lista desplazable.

+0

Gracias Stefaan! – huesforalice

+18

solo debe hacer 'actionSheet.cancelButtonIndex = [actionSheet addButtonWithTitle: @" Cancel "];' – user102008

+0

¿La localización no rompería esta solución? –

1

file a bug sobre el problema. Incluya un pequeño proyecto de muestra y espere algunos meses para recibir noticias suyas.

Por ahora se puede configurar los botones de forma estática en el init

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

obras sin problemas.

+0

Gracias por su consejo, necesito configurar los botones de una matriz, lo anterior fue solo un ejemplo para señalar que el método addButtonWithTitle no parece funcionar. – huesforalice

0

hacer como la siguiente:

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

Significa que definen el botón destructivo como destructiveButtonTitle. EVITE usar el botón de destrucción/cancelación en el otherButtonTitles.

1

1) una instancia de la ActionView usando

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

sin el botón de cancelar o botón destructivo (ponerlos a cero)

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

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

4) Ahora configure la propiedad [myActionSheet setCancelButtonIndex:] en el índice del último botón en la hoja de acciones, que fue el botón de cancelar. Haz lo mismo con un botón destructivo. (Estos son -1 por defecto, lo que provoca que no se muestran)

  • Tenga en cuenta que un botón destructiva siempre aparecerá en la parte superior, y un botón de cancelar siempre aparecerá en la parte inferior, que no puede ser cambiado.

  • Además, ciertamente puede agregar el botón cancelar/destruir en el índice 0, y agregar todos los otros botones después de eso. Sin embargo, ahora el primer índice de tus otros botones es 1, en lugar de cero. Esto puede ser confuso si tiene una matriz que corresponde con los botones de alerta.

Cuestiones relacionadas