2011-10-06 13 views
7

Sto provando a visualizzare uno UIActionSheet dal mio iPad. Ecco il codice che sto usando:UIActionSheet iPad - Non viene visualizzato l'ultimo pulsante aggiunto

-(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 versione per iPhone del programma visualizza tutti i pulsanti in _menuItems, ma la versione iPad semplicemente ignora l'ultimo elemento da tale matrice. Qualcuno sa perché questo potrebbe accadere?

Grazie,
Teja.

+0

quanti elementi ci sono in '_menuItems'? – matsr

risposta

2

Trovato la risposta non appena ho digitato questo post. In qualche modo la rimozione del pulsante "Annulla" fa apparire entrambi i pulsanti. Strano.

MODIFICA: Anche se questo è davvero fastidioso perché tutti gli indici dei tasti cambiano tra le versioni dell'iPhone e dell'iPad (l'iPhone ha ancora bisogno del pulsante Annulla). Come gestisco questo?

0

Penso che ciò che iOS sta facendo è che si aspetta che l'ultimo pulsante sia il pulsante Annulla (indipendentemente dal fatto che lo sia o meno) e lo rimuova, ma forse solo per iPad. Ciò è probabilmente dovuto al fatto che un utente può toccare all'esterno del il foglio di azione per chiuderlo. Il problema che ho con la scelta progettuale di Apple è che potrebbe non essere sempre evidente che il dialogo può o deve essere respinto in quel modo.

Ad esempio, sto mostrando il mio foglio di azione chiamando [actionSheet showInView:self.view]; Ciò fa sì che l'intera vista venga visualizzata in grigio con il foglio di azione visualizzato nel mezzo del dispositivo. Gli utenti stanno andando - giustamente, secondo la mia opinione - assumono che debbano scegliere uno dei pulsanti.

Capisco che ci sono altri meccanismi di visualizzazione del foglio di azione, come quello che lo visualizza come una bolla collegata a un elemento del pulsante della barra, dove ovviamente un pulsante di annullamento è ridondante. Sarebbe bello se Apple avesse concesso maggiore flessibilità qui. Per la mia app, probabilmente dovrò aggiungere un pulsante fittizio alla fine dell'array che sto passando al mio costruttore personalizzato, sapendo che iOS lo nasconderà. Se il comportamento cambia in una versione futura di iOS ... beh, dovrò solo affrontarlo in quel momento.

Nel tuo caso, consiglio di non utilizzare il costruttore che accetta cancelButtonTitle e destructiveButtonTitle. Invece, sottoclasse UIActionSheet e aggiungi pulsanti manualmente usando il metodo sopra. Quindi, imposta cancelButtonIndex e destructiveButtonIndex sugli indici desiderati. Ricorda che non è avere per impostare queste due proprietà; sono predefiniti a -1 (nessun pulsante). Inoltre, ricorda di rispettare l'HIG per quanto riguarda la posizione dei pulsanti.

Ecco uno dei costruttori miei sottoclasse (a cura per brevità), giusto per dare un'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; 
} 
Problemi correlati