Strano comportamento del pulsante Annulla di UIActionSheet


116

Ho un UIBarButtonItem che apre un foglio di azione per offrire agli utenti scelte su cosa fare. Tutto funziona come previsto a meno che non provi a fare clic sul pulsante "Annulla". La destinazione del pulsante sembra essersi spostata verso l'alto da dove dovrebbe essere. Posso attivarlo solo facendo clic da qualche parte nel mezzo dei pulsanti "Annulla" e "Ok".

Ho provato a fogli di azione in altre applicazioni e funzionano bene, quindi non è solo il mio grande pollice. Il foglio delle azioni si sta aprendo in un UIViewController

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}

5
In una nota non correlata, mi è stato detto al WWDC durante una sessione di revisione dell'interfaccia utente di Apple che il pulsante rosso sui fogli di azione è in realtà destinato ad azioni "distruttive" (ad esempio "elimina").
Ramin

Sì, di recente ho letto le linee guida dell'interfaccia umana e l'ho visto. L'ho cambiato da rosso a grigio.
nevan king

Risposte:


190

Invece di passare la vista del controller di visualizzazione corrente al foglio delle azioni, utilizzare il showFromTabBar:metodo di UIActionSheet.

Il modo giusto
Questo darà l'area selezionabile corretta:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Il modo sbagliato
Questo metterà l'area selezionabile nel posto sbagliato (se stai usando una barra delle schede o una barra degli strumenti):

[actionSheet showInView:self.view];

Se stai usando una barra degli strumenti , usa showFromToolbar:invece il metodo. Avrai bisogno di un riferimento alla barra degli strumenti, molto probabilmente un ivar

[actionSheet showFromToolbar:self.myToolbar];

Anche la mia vecchia risposta funziona, ma è hacky:

Ho appena trovato una possibile risposta:

01-dic-2008 22:22 Tom Saxton: Ho esaminato ancora un po 'questo bug e sembra essere un problema con la barra delle schede.

Se chiami [sheet showInView: self.view] di UIActionSheet da un controller di visualizzazione figlio di un UITabViewController, l'hit testing sul pulsante Annulla fallisce in quella parte di UIActionSheet che si trova sopra la visualizzazione della barra delle schede.

Se invece passi nella visualizzazione di UITabBarController, l'UIActionSheet si comporta come previsto.

NOTA: in iPhone OS 2.1 e versioni precedenti, il foglio UIActionSheet veniva fuori dalla parte superiore della barra delle schede quando si passa alla visualizzazione figlio, ma in 2.2, esce dalla parte inferiore della barra delle schede e quindi copre la visualizzazione schede.

http://openradar.appspot.com/6410780

Modifica: funziona correttamente quando cambio la visualizzazione per essere la visualizzazione della barra delle schede

[sheet showInView:self.parentViewController.tabBarController.view];

Votato questo perché funziona. Perché questo è migliore delle altre risposte?
Bentford

1
Perché parentViewController? Anche se la visualizzazione è in una scheda di visualizzazione di navigazione, BarController dovrebbe comunque puntare al posto giusto. In ogni caso, funziona per me senza parentViewController.
Nathan

11
Un'altra risposta sembra potenzialmente migliore. Cerca [actionSheet showInView: [self.view window]]. Sembra più semplice e generico.
Kevin

Grazie mille per aver pubblicato questa risposta.
fulvio

1
Non ho la barra delle schede nella mia app, ma ho ancora questo problema. L'ho risolto con "[serf.view window]". Non è comunque un problema della barra delle schede.
Mike Keskinov

37

Ho trovato qui una risposta che funziona.

utilizzando [filterActionSheet showInView:[self.view window]]:;

ho provato alcuni modi per arrivare alla mia barra delle schede e il modo in cui questa app è configurata sembra contorto ...


PERFETTO! Grazie. Questa è la soluzione corretta per me, poiché avevo questo problema con un UITableViewController che aveva una barra degli strumenti non una TabBar come gli altri qui.
William Denniss

roba buona, questo ha funzionato per me! questo è sicuramente il modo più semplice per farlo!
cgossain

2
Causa un altro problema. ActionSheet appare in orientamento verticale quando il dispositivo è in orizzontale (così come tutti gli altri contenuti).
Mike Keskinov

22

Usa invece:

[sheet showFromTabBar:theTabBar];

1
L'ho corretto da showInTabBar:a showFromTabBar:. Nota anche che esiste un metodo "showFromToolbar:", a seconda di quale mobile dello schermo hai nella parte inferiore dello schermo. Questa, penso, sia una risposta migliore della risposta accettata.
Stephen Darlington,

Stephen, curioso perché pensi che questo sia meglio che specificare showInView: theTabBar? Dal punto di vista dell'accoppiamento, penserei che showInView sarebbe probabilmente più ideale, nel caso in cui in seguito la tabBar venga rilasciata, magari sostituita con una barra degli strumenti, per esempio. Il particolare controller di visualizzazione secondaria non dovrebbe davvero sapere o preoccuparsi, penso.
Billy Gray

Se la barra delle schede viene rilasciata in un secondo momento, dovrai modificare quella riga di codice a prescindere (a meno che forse theTabBar non sia un riferimento con un nome errato a una vista passata). Quindi non vedo come questo metodo sia più accoppiato di showInView: theTabBar. Uso anche showFromTabBar: perché mi sembra più sicuro. Non so cosa stia succedendo sotto le coperte, ma immagino che showFromTabBar: abbia meno probabilità di non funzionare nelle versioni future del sistema operativo rispetto a showFromView: con una visualizzazione della barra delle schede.
Christopher Pickslay

10

Ecco la soluzione. Prova questo:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

5

Penso che una combinazione di tre delle risposte sia il modo giusto di gestire questo:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

cioè, usa showFromTabBar (ecco perché esiste) e non hai bisogno del parentViewController come ha sottolineato Nathan (infatti, self.parentViewController.tabBarController.tabBar restituisce nil per me.


Ovviamente restituisce nil, perché il controller della vista padre (che è UITabBarViewController) non è annidato in un altro UITabBarController, quindi la sua proprietà tabBarController è nil.
Dominik Seibold

1

Cordiali saluti, ho riscontrato lo stesso problema con il foglio delle azioni di UIDocumentInteractionController che passava sulla barra delle schede. Utilizzato quanto segue per correggere.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

-2

scrivere codice semplice

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

questo funziona bene

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.