2010-08-01 6 views
4

J'ai une application iPhone qui est basée sur le modèle "Application basée sur la fenêtre" et qui utilise une vue principale avec des sous-vues intégrées.UIActionSheet ne s'affiche pas - l'écran s'assombrit

Pour certaines actions j'ai besoin d'une confirmation par l'utilisateur. Par conséquent, je crée une feuille UIActionSheet et demande à l'utilisateur pour la rétroaction.

Le problème est que la feuille d'action ne s'affiche pas du tout. Au lieu de cela, l'écran s'assombrit. La feuille et les boutons demandés ne s'affichent pas. Après cela, l'application se bloque. L'assombrissement de l'écran est un comportement normal dans le cadre de l'animation qui montre normalement la feuille d'action.

Curieusement, le même code fonctionne correctement s'il est invoqué dans la méthode viewDidLoad. Cela ne fonctionne pas si invoqué dans la méthode buttonPressed qui lance l'action nécessitant la confirmation.

- (void) trashButtonPressed { 
    // This method is called in the button handler and (for testing 
    // purposes) in the viewDidLoad method. 
    NSLog(@"trashButtonPressed"); 

    UIActionSheet* actionSheet = 
     [[UIActionSheet alloc] initWithTitle: @"Test" 
            delegate: self 
          cancelButtonTitle: @"Cancel" 
         destructiveButtonTitle: @"Delete Sheet" 
          otherButtonTitles: nil]; 

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

- (void)  willPresentActionSheet:(UIActionSheet *) actionSheet { 
    NSLog(@"willPresentActionSheet"); 
} 

- (void)  didPresentActionSheet:(UIActionSheet *) actionSheet { 
    NSLog(@"didPresentActionSheet"); 
} 

- (void)  actionSheet:(UIActionSheet *)actionSheet 
    didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    NSLog(@"actionSheet:didDismissWithButtonIndex"); 
} 

Comme vous pouvez le voir, j'ai ajouté quelques messages de journalisation aux gestionnaires de protocole du UIActionSheetDelegateProtocol. Les méthodes "will present" et "did present" sont appelées comme prévu, mais la feuille n'apparaît pas.

Est-ce que quelqu'un sait, qu'est-ce qui ne va pas ici?

+0

La balise iphone-sdk-3? Vous utilisez toujours un SDK 3.x? –

Répondre

3

Je me demande si [actionSheet showInView: self.view]; suffit pour que la feuille d'action soit elle-même conservée par self.view. (modifier: retenir les sauts de compte de 1 à 4 donc pas un problème ici)

Avez-vous vérifié les dimensions de votre vue? La feuille est positionnée dans la vue, mais si self.view se réfère à une grande scrollview, vous pourriez avoir une feuille sous la surface. En bref, êtes-vous sûr que self.view.frame et self.view.bounds ont les mêmes valeurs dans les deux situations auxquelles vous faites référence? Est-ce la même vue (quand juste NSLog(@"%x",self.view)-c'est son adresse)?

modifier pour clarifier: faire

NSLog(@"%f %f %f %f", 
     self.view.frame.origin.x,self.view.frame.origin.y, 
     self.view.frame.size.width,self.view.frame.size.height); 

et s'il vous plaît dire ce que vous voyez sur la console. J'obtiens votre "écran devient plus sombre" si je mets une trame de 0,0,0,0 ou une trame de 0,0,320,800, donc cela pourrait être ...

+1

Ce n'était pas ça, mais ça m'a poussé dans la bonne direction. Je l'ai résolu maintenant. Le problème était: J'ai accidentellement copié un MainWindow.xib de l'iPad à la section iPhone de mon application universelle. La version iPad a une taille de 1024x768. Dans "viewDidLoad", la fenêtre n'a pas été définie par AppDelegate. Par conséquent, le système d'exploitation n'utilise pas les coordonnées incorrectes. Plus tard, la fenêtre est définie et la feuille est rendue à la mauvaise position. Fait intéressant, self.view.frame a toujours été (0 20; 320 460), mais view.window.frame était (0 0; 768 1024). Merci. – h2stein

+4

Juste un conseil pratique pour mvds: Vous pouvez utiliser NSStringFromCGRect (self.view.frame) au lieu de NSLogging individuellement chacune des valeurs de la trame. –

+0

@Matt: merci pour le bon conseil! – mvds

0

En fait, je pense que vous avez frappé le mêmes problèmes que j'ai vus.

Dans iOS 8 & 9, le UIActionSheet-t ... oh s'affiche ... mais derrière le clavier à l'écran, de sorte que vous ne pouvez pas le voir. Vous voyez juste le reste de l'écran devenir plus sombre. Ceci, apparemment, est la dernière idée d'amélioration de l'interface utilisateur d'Apple, pour garder l'écran épuré. ;-)

La solution simple est d'ajouter une ligne de code avant d'afficher votre UIActionSheet:

[self.view endEditing:true]; 

Ce rejette le clavier à l'écran, ce qui rend votre belle feuille d'action visible à nouveau. Sinon, j'ai documented here comment remplacer votre UIActionSheet avec UIAlertController.

Questions connexes