UIActionSheet annuler le comportement étrange du bouton

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 la position souhaitée. 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 juste mon gros pouce. La feuille d’action s’ouvre dans un UIViewController

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

Au lieu de transmettre la vue du contrôleur d’affichage actuel à la feuille d’action, utilisez la méthode showFromTabBar: de UIActionSheet .

Le droit chemin
Cela donnera la zone de taraudage correcte:

 [actionSheet showFromTabBar:self.tabBarController.tabBar]; 

La mauvaise direction
Cela mettra la zone tappable au mauvais endroit (si vous utilisez une barre d’tabs ou une barre d’outils):

 [actionSheet showInView:self.view]; 

Si vous utilisez une barre d’outils , utilisez plutôt la méthode showFromToolbar: Vous aurez besoin d’une référence à la barre d’outils, probablement une ivar

 [actionSheet showFromToolbar:self.myToolbar]; 

Ma vieille réponse fonctionne aussi, mais est pirate:

Juste trouvé une réponse possible:

01-Dec-2008 22h22 Tom Saxton: J’ai regardé ce bogue un peu plus, et cela semble être un problème avec la tabbar.

Si vous appelez [sheet showInView: self.view] de UIActionSheet à partir d’un contrôleur de vue qui est un enfant d’un object UITabViewController, le test de réussite du bouton d’annulation échoue dans la partie de la feuille UIAction située au-dessus de la vue.

Si, au lieu de cela, vous passez 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 apparue en haut de la barre des tabs lorsque vous avez passé la vue enfant, mais en 2.2, elle apparaît en bas de la barre d’tabs.

http://openradar.appspot.com/6410780

Edit: Cela fonctionne correctement quand je change la vue pour être la vue de la barre d’tabs

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

J’ai trouvé une réponse ici qui fonctionne.

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

J’ai essayé de plusieurs manières pour accéder à ma barre d’tabs et leur configuration semble compliquée …

Au lieu de cela, utilisez:

 [sheet showFromTabBar:theTabBar]; 

Voici le correctif.Essayez ceci:

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

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 indiqué (en fait, self.parentViewController.tabBarController.tabBar renvoie zéro pour moi).

FYI – avait le même problème avec la feuille de calcul de UIDocumentInteractionController incrémentée dans la barre. Utilisé ce qui suit pour réparer.

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

écrire le code simplite

  actionSheet.actionSheetStyle = UIActionSheetStyleDefault; 

ce travail bien