33 votes

Le contrôleur de la vue modale ne se ferme pas

Ce que je fais :

Dans mon application, je présente un contrôleur de vue modal (contenant les paramètres de l'application) en utilisant le code suivant :

    optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentModalViewController:optionsViewController animated:YES];

Cette transition ne fait que recourber la partie inférieure de la vue pour exposer quelques paramètres. (Voir l'application "Maps" pour un exemple.) Lorsque vous tapez sur la moitié supérieure de la page, où la vue originale est toujours là mais grisée, le contrôleur de vue modale est automatiquement rejeté (géré par le système d'exploitation, je n'ai pas codé pour cela).

-

Ce qui ne marche pas :

Cela fonctionne bien sous iOS 4 (mon application est d'ailleurs actuellement sur l'App Store). Mais dans iOS 5, il semble qu'Apple ait modifié le comportement de cette transition, et le contrôleur de vue ne se désactive plus. J'essaie de reproduire le comportement qui était géré par le système d'exploitation avant, mais je n'arrive pas à trouver comment faire.

-

Ce que j'ai essayé :

L'ajout d'un bouton invisible en haut de la vue des options ne fonctionne pas. La page s'enroule alors complètement, ce que je ne veux pas.

A part ça, je suis coincé. Comment puis-je reproduire la façon dont cela fonctionnait à l'origine (ou est-ce que je m'y suis mal pris dès le départ !). Toute aide est la bienvenue !

71voto

Mazyod Points 6072

Mec, j'ai rencontré le même problème et voici ce que j'ai trouvé sur l'utilisation de parentViewController :

Notez qu'à partir de la version 5.0, ceci ne retournera plus ne retournera plus la vue présentée contrôleur.

Ceci a été écrit dans le fichier d'en-tête de UIViewController...

J'utilise ShareKit, et le modalViewController fonctionnait parfaitement sous iOS4, mais sous iOS5, il ne veut pas se fermer ! C'est parce que dans leur code, ils utilisent :

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

et parentViewController retournera nil, puisqu'il s'agit d'un contrôleur de vue à présentation modale...

En cherchant une solution, j'ai trouvé votre question Alors, j'ai décidé de la réparer moi-même :P

J'ai changé la ligne précédente en ceci :

    [currentView dismissModalViewControllerAnimated:YES];

Fonctionne comme un charme.


EDIT : Selon la façon dont on interprète la question initiale, il y a deux réponses. Voici la seconde :

Dans iOS5, il semble que le contrôleur modal ne se désactive que lorsque vous cliquez sur la boucle, mais pas au-dessus de la boucle ou du fond. Dans iOS5, afin de faire en sorte que la vue modale se ferme d'elle-même lorsque l'on clique sur l'arrière-plan ou au-dessus de la boucle, j'ai ajouté le code suivant au contrôleur, pour écouter les clics sur la vue modale, mais ignorer les clics sur les boutons. Cela devrait imiter le comportement de la version précédente d'iOS lorsque l'on travaille avec un contrôleur modal avec page curl.

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    tap.delegate = self;          
    [backgroundView addGestureRecognizer:tap];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    //change it to your condition    
    if ([touch.view isKindOfClass:[UIButton class]]) {      
       return NO;
    }
    return YES;
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    [self dismissModalViewControllerAnimated:YES];
}

15voto

Ben Gottlieb Points 59900

Quel est le code que vous utilisez pour rejeter le contrôleur de la vue modale ? J'ai vu du code comme celui-ci :

[self.parentViewController dismissModalViewControllerAnimated: YES];

qui ne fonctionne pas sur toutes les versions de l'OS. Cependant, ceci :

[self dismissModalViewControllerAnimated: YES];

devrait.

1voto

Luis Ascorbe Points 696

J'ai eu le même problème, affecte aussi ceux qui utilisent :

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

Je l'ai réparé avec un observateur, en ajoutant ceci là où vous aviez le rejet :

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];

Et ceci dans le contrôleur de vue parent :

// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];

//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
   [self dismissModalViewControllerAnimated:YES];
}

// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];

0voto

benvolioT Points 3003

Cela semble fonctionner sur la version (désormais définitive) d'ios 5.

J'ai remarqué qu'il faut toucher une zone spécifique pour faire disparaître la boucle de la page - toucher près des bords de la partie supérieure de l'écran ne semble rien faire, mais la partie centrale, floue, au-dessus du graphique de la boucle de la page permet de faire disparaître la vue modale.

Je ne suis pas sûr que ce comportement de région de tapotement étroit soit nouveau dans ios 5 ou qu'il existait déjà et que je ne l'ai jamais remarqué auparavant. J'espère que cela vous aidera !

0voto

Linda Saul Points 1

Merci les gars, ça m'a fait gagner beaucoup de temps. Je viens de remarquer que le presentModalViewController y dismissModalViewController sont dépréciées selon le code source de l'application UIViewControoler.h . Il existe des alternatives presentViewController y dismissViewController méthodes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X