2011-10-18 3 views
2

Tout d'abord, pouvons-nous parler d'iOS 5 ici? Ou est-ce encore sous NDA? Si nous ne pouvons pas en parler, ignorez simplement ma question. En testant mon application avec un iPad avec iOS 5 installé, j'ai découvert un problème avec mon popover "modal": Ceci peut être fermé en tapant à l'extérieur, en d'autres termes, ce n'est pas modal! Je n'ai aucune idée de ce que je fais de mal.UIPopoverController présenté de manière modale ne fonctionne pas dans iOS 5

Un contrôleur de vue ouvre la popover avec ce code:

AddProjectViewController *addProjectViewController = [[AddProjectViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
[addProjectViewController setDelegate:self]; 

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addProjectViewController]; 
[addProjectViewController release]; 

CGRect popoverFrame = [sender frame]; 

UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navController]; 
[tempPopover presentPopoverFromRect:popoverFrame inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
self.currentPopover = tempPopover; 
[tempPopover release]; 
[navController release]; 

Le contrôleur de vue que l'intérieur est de la popover a cette ligne dans son viewDidLoad.

- (void)viewDidLoad 
{ 
    [self setModalInPopover:YES]; 

    // Do other stuff 
} 

Y at-il quelque chose qui manque?

Répondre

10

Je l'ai trouvé. L'affectation de setModalInPopover doit être à l'intérieur de la méthode viewDidAppear du contrôleur de vue intégrée pour la popover être modale:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [self setModalInPopover:YES]; 
} 
+2

On dirait un bug pour moi. J'avais besoin de mettre [self setModalInPopover: [self isModalInPopover]] 'dans la méthode viewDidAppear, car je place cette valeur en externe dans le code qui crée le contrôleur de vue. – zeroimpl

0

Avez-vous essayé de définir la propriété modalInPopover du contrôleur de navigation? C'est le contrôleur de vue qui est réellement "détenu" par le popover, donc je m'attendrais à ce que le popover utilise sa propriété modalInPopover pour déterminer s'il est modal ou non.

Peut-être que UINavigationController l'a transmis à son contrôleur de vue enfant actuellement visible dans iOS 4.x.

+0

Vous avez raison, il est logique que cela devrait fonctionner si J'ai défini la propriété modalInPopover du contrôleur de navigation. Mais ça ne marche pas comme ça. J'ai trouvé la solution, cependant. Je l'afficherai bientôt, ça pourrait aider les autres. – strave

1

La réponse approuvée fonctionnera si vous utilisez un contrôleur de vue personnalisée qui connaît le point de vue va être un dans un popover. Toutefois, si vous utilisez un contrôleur de vue générique créé par programmation ou un contrôleur de vue dont la méthode viewDidAppear ne peut pas être surchargée pour une raison quelconque, vous pouvez également implémenter le protocole UIPopoverControllerDelegate dans une classe, définir le délégué popover sur cette classe et retourner NO, dans le popoverControllerShouldDismissPopover.

Exemple

Dans une classe qui implémente UIPopoverControllerDelegate:

- (BOOL) popoverControllerShouldDismissPopover:(UIPopoverController *) popoverController { 
    return NO; 
} 

Dans le code qui crée votre contrôleur popover:

UIPopoverController * pc = initialize and setup 

pc.delegate = instance of class that impleements UIPopoverControllerDelegate 
Questions connexes