web-dev-qa-db-fra.com

Comportement étrange du bouton Annuler UIActionSheet

J'ai un UIBarButtonItem ouvrant une feuille d'action pour offrir aux utilisateurs des choix sur ce qu'il faut faire. Tout fonctionne comme prévu, sauf si j'essaie de cliquer sur le bouton "Annuler". La cible du bouton semble s'être déplacée de l'endroit où elle devrait être. Je ne peux l'activer qu'en cliquant quelque part au milieu des boutons "Annuler" et "Ok".

J'ai essayé des feuilles d'action dans d'autres applications et elles fonctionnent bien, donc ce n'est pas seulement mon gros pouce. La feuille d'action s'ouvre dans 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];
}
116
nevan king

Au lieu de passer la vue du contrôleur de vue actuel à la feuille d'action, utilisez le showFromTabBar: méthode de UIActionSheet.

La bonne façon
Cela donnera la zone de prise correcte:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

La mauvaise façon
Cela placera la zone à taper au mauvais endroit (si vous utilisez une barre d'onglets ou une barre d'outils):

[actionSheet showInView:self.view];

Si vous utilisez une barre d'outils , utilisez le showFromToolbar: méthode à la place. Vous aurez besoin d'une référence à la barre d'outils, probablement un ivar

[actionSheet showFromToolbar:self.myToolbar];

Mon ancienne réponse Fonctionne également, mais est hacky:

Je viens de trouver une réponse possible:

01-déc.-2008 10:22 PM Tom Saxton: J'ai encore regardé ce bug, et il semble que ce soit un problème avec la barre d'onglets.

Si vous appelez [sheet showInView: self.view] de UIActionSheet à partir d'un contrôleur de vue qui est un enfant d'un UITabViewController, le test de réussite sur le bouton Annuler échoue dans cette partie de la feuille UIActionSheet située au-dessus de la vue de la barre de tabulation.

Si vous passez à la place dans la vue UITabBarController, la feuille UIActionSheet agit comme prévu.

REMARQUE: dans iPhone OS 2.1 et versions antérieures, la feuille UIActionSheet est sortie du haut de la barre d'onglets lorsque vous passez la vue enfant, mais dans 2.2, elle vient du bas de la barre d'onglets, et couvre ainsi la vue d'onglet.

http://openradar.appspot.com/641078

Edit: Cela fonctionne correctement lorsque je change la vue pour être la vue de la barre d'onglets

[sheet showInView:self.parentViewController.tabBarController.view];
190
nevan king

J'ai trouvé une réponse sur ici qui fonctionne.

en utilisant: [filterActionSheet showInView:[self.view window]];

j'ai essayé plusieurs façons d'accéder à ma barre d'onglets et la façon dont cette application est configurée semble compliquée ...

37
driveguy

Utilisez plutôt:

[sheet showFromTabBar:theTabBar];
22
Corey Floyd

Voici la solution, essayez ceci:

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

Je pense qu'une combinaison de trois des réponses est la bonne façon de gérer cela:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

c'est-à-dire, utilisez showFromTabBar (c'est pourquoi il existe) et vous n'avez pas besoin du parentViewController comme Nathan l'a souligné (en fait, self.parentViewController.tabBarController.tabBar renvoie zéro pour moi.

5
RawMean

FYI - a eu le même problème avec la feuille d'actions UIDocumentInteractionController en marchant sur la barre d'onglets. Utilisé ce qui suit pour corriger.

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