2011-10-06 13 views
7

Estoy tratando de mostrar un UIActionSheet desde mi iPad. Aquí está el código que estoy usando:iPad UIActionSheet - No muestra el último botón agregado

-(void) presentMenu { 
    UIActionSheet *popupMenu = [[UIActionSheet alloc] initWithTitle:@"Menu" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:nil]; 
    for (NSString *option in _menuItems) { 
     [popupMenu addButtonWithTitle:option]; 
    } 
    popupMenu.actionSheetStyle = UIActionSheetStyleBlackOpaque; 
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
     [popupMenu showFromTabBar:_appDelegate.tabBar.tabBar]; 
    } 
    else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     [popupMenu showFromBarButtonItem:self.navigationItem.rightBarButtonItem animated:YES]; 
    } 
    [popupMenu release]; 
    return; 
} 

La versión iPhone del programa muestra todos los botones en _menuItems, pero la versión de iPad simplemente ignora el último elemento de la matriz. ¿Alguien sabe por qué esto podría estar sucediendo?

Gracias,
Teja.

+0

¿Cuántos elementos hay en '_menuItems'? – matsr

Respuesta

2

Encontré la respuesta apenas escribí esta publicación. De alguna manera, al quitar el botón "Cancelar", ambos botones aparecen. Extraño.

EDITAR: Aunque esto es realmente molesto porque todos los índices de mis botones cambian entre las versiones de iPhone y iPad (el iPhone aún necesita el botón cancelar). ¿Cómo manejo esto?

0

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; 
} 
Cuestiones relacionadas