2009-07-29 10 views
114

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 avoir bougé d'où elle devrait être. Je ne peux l'activer qu'en cliquant quelque part au milieu des boutons "Annuler" et "Ok".UIActionSheet bouton d'annulation comportement étrange

alt text http://img.skitch.com/20090729-t994x5g3ka5sksi7sskt7is5mi.jpg

J'ai essayé à des fiches d'action dans d'autres applications et ils fonctionnent très bien, donc il n'y a pas que mon grand pouce. La feuille d'action ouvre dans une 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

Sur une note sans rapport, on m'a dit à la WWDC au cours d'une session d'examen interface utilisateur d'Apple que le bouton rouge sur les feuilles d'action est vraiment destiné à des actions « destructrices » (c'est à dire 'effacer'). – Ramin

+0

Ouais, j'ai lu les lignes directrices de l'interface humaine récemment et j'ai vu ça. Changé du rouge au gris. –

Répondre

190

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

La bonne façon
Cela donnera la zone tappable correcte:

[actionSheet showFromTabBar:self.tabBarController.tabBar]; 

La mauvaise manière
Cela mettra la zone tappable au mauvais endroit (si vous utilisez un barre d'onglets ou la barre d'outils):

[actionSheet showInView:self.view]; 

Si vous usin Dans la barre d'outils, utilisez plutôt la méthode showFromToolbar:. Vous aurez besoin d'une référence à la barre d'outils, plus probablement un Ivar

[actionSheet showFromToolbar:self.myToolbar]; 

My Old réponse fonctionne également, mais est aki:

Je viens de trouver une réponse possible:

01-déc-2008 22:22 Tom Saxton: J'ai regardé ce bug un peu plus, et cela semble être un problème avec la barre d'onglets. Si vous appelez [feuille showInView: self.view] de UIActionSheet à partir d'un contrôleur de vues qui est un enfant d'un UITabViewController, le test d'accès sur le bouton d'annulation échoue dans la partie de la feuille UIAction qui se trouve au-dessus de la vue tabulation.

Si vous passez à la place dans la vue UITabBarController, alors la UIActionSheet agit comme prévu. REMARQUE: dans iPhone OS 2.1 et versions antérieures, l'UIActionSheet est apparue en haut de la barre d'onglets lorsque vous avez passé la vue enfant, mais en 2.2, elle provient du bas de la barre d'onglets, et couvre donc la vue de l'onglet.

http://openradar.appspot.com/6410780

Edit: Il fonctionne correctement lorsque je change la vue à l'onglet point de vue de la barre

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

Vous venez de m'aider à résoudre un problème que je ne connaissais pas! –

+0

Upvoted ceci parce que cela fonctionne. Pourquoi est-ce mieux que les autres réponses? – bentford

+0

Une réponse qui continue d'aider ... beau travail! – pchap10k

37

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

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

j'ai essayé quelques façons de se rendre à ma barre d'onglets et ils ainsi cette application est mis en place, il semble alambiqué ...

+0

PARFAIT! Merci. C'est la bonne solution pour moi, car j'avais ce problème avec un UITableViewController qui avait une barre d'outils * pas * un TabBar comme les autres ici. –

+0

Fonctionne pour moi! Merci! – nonamelive

+0

bonnes choses, cela a fonctionné pour moi! C'est certainement le moyen le plus facile de le faire! – cgossain

22

utiliser:

[sheet showFromTabBar:theTabBar]; 
+1

J'ai corrigé ceci de 'showInTabBar:' à 'showFromTabBar:'. Notez également qu'il existe une méthode 'showFromToolbar: ', selon le type de meuble que vous avez en bas de l'écran. Ceci, je pense, est une meilleure réponse que la réponse acceptée. –

+0

Stephen, curieux de savoir pourquoi vous pensez que c'est mieux que de spécifier showInView: theTabBar?Du point de vue du couplage, je pense que showInView serait probablement plus idéal, au cas où plus tard le tabBar serait supprimé, peut-être remplacé par une barre d'outils, par exemple. Le contrôleur de sous-vue particulier ne devrait pas vraiment savoir ou se soucier, je pense. –

+0

Si la barre d'onglets est supprimée plus tard, vous devrez modifier cette ligne de code (à moins que theBarTabBar soit une mauvaise référence à une vue transmise). Donc je ne vois pas comment cette méthode est plus couplée que showInView: theTabBar. J'utilise showFromTabBar: aussi, car il me semble plus sûr. Je ne sais pas ce qui se passe sous les couvertures, mais j'imagine que showFromTabBar: est moins susceptible de casser dans les futures versions du système d'exploitation que showFromView: avec une vue de la barre d'onglets. –

1

Pour votre information - avait le même problème avec La feuille d'action de UIDocumentInteractionController sur la barre d'onglets. Utilisé ce qui suit pour corriger.

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

Je pense une combinaison de trois des réponses est la bonne façon de traiter ceci:

[actionSheet showFromTabBar:self.tabBarController.tabBar]; 

-à-dire, utiliser showFromTabBar (c'est pourquoi il existe) et vous n'avez pas besoin parentViewController comme Nathan a fait remarquer (en fait, self.parentViewController.tabBarController.tabBar renvoie nil pour moi

+0

Bien sûr, il renvoie zéro, car le contrôleur de vue parent (qui est UITabBarViewController) n'est pas imbriqué dans un autre UITabBarController, sa propriété tabBarController est donc nulle. –

10

Voici le fix.Try ceci:.

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

Ça marche pour moi, merci. –

-2

écrire du code SimpLite

actionSheet.actionSheetStyle = UIActionSheetStyleDefault; 

ce beau travail