Creo que lo que iOS está haciendo es esperar que el último botón sea el botón de cancelar (independientemente de si lo es o no) y lo está eliminando, pero tal vez solo para iPads. Esto es probablemente porque un usuario puede tocar fuera de la hoja de acciones para descartarlo. El problema que tengo con la elección de diseño de Apple es que no siempre es evidente que el diálogo puede o debe descartarse de esa manera.
Por ejemplo, estoy mostrando mi hoja de acción llamando al [actionSheet showInView:self.view];
Esto hace que toda la vista se vea atenuada con la hoja de acción que se muestra en el medio del dispositivo. Los usuarios van a - con razón, en mi opinión - asumen que tienen que elegir uno de los botones.
Entiendo que hay otros mecanismos de visualización de hoja de acciones, como el que se muestra como una burbuja unida a un elemento de botón de barra, donde un botón de cancelación es obviamente redundante. Sería bueno si Apple permitiera más flexibilidad aquí. Para mi aplicación, probablemente voy a tener que agregar un botón falso al final de la matriz que estoy pasando a mi constructor personalizado, sabiendo que iOS lo ocultará. Si el comportamiento cambia en una versión futura de iOS ... bueno, tendré que abordarlo en ese momento.
En su caso, recomiendo no usar el constructor que toma cancelButtonTitle y destructiveButtonTitle. En su lugar, subclase UIActionSheet y agregue botones manualmente usando el método anterior. Luego, establezca cancelButtonIndex y destructiveButtonIndex en los índices deseados. Recuerde que no tiene tiene para establecer esas dos propiedades; por defecto son -1 (sin botón). Además, recuerde cumplir con el HIG con respecto a la posición de sus botones.
He aquí una de mis constructores de subclases (editado por brevedad), sólo para darles una idea:
- (instancetype)initWithTitle:(NSString *)title
buttonTitles:(NSArray *)buttonTitles
cancelButtonIndex:(NSInteger)cancelButtonIndex
destructiveButtonIndex:(NSInteger)destructiveButtonIndex
{
self = [super initWithTitle:title delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
if (self)
{
if (buttonTitles)
{
[buttonTitles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
[self addButtonWithTitle:obj];
}];
}
self.cancelButtonIndex = cancelButtonIndex;
self.destructiveButtonIndex = destructiveButtonIndex;
if (self.cancelButtonIndex > -1)
{
[self addButtonWithTitle:@""];
}
}
return self;
}
¿Cuántos elementos hay en '_menuItems'? – matsr