web-dev-qa-db-fra.com

Le contrôleur de vue modale ne se rejettera pas

Ce que je fais:

Dans mon application, je présente un contrôleur de vue modale (contenant les paramètres de l'application) à l'aide du code suivant:

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

Cette transition recourbe simplement la partie inférieure de la vue pour exposer quelques paramètres. (Voir l'application `` Cartes '' pour un exemple.) Lorsque vous appuyez sur la moitié supérieure de la page, où la vue d'origine est toujours là mais grisée, le contrôleur de vue modale est automatiquement rejeté (géré par le système d'exploitation, je ne l'ai pas fait) t code pour cela).

-

Ce qui ne fonctionne pas:

Cela fonctionne bien dans iOS 4 (mon application est actuellement sur l'App Store en fait). Mais dans iOS 5, il semble que Apple ont changé le comportement de cette transition, et le contrôleur de vue ne se rejette plus. J'essaie de reproduire le comportement qui était géré par le système d'exploitation avant , mais je ne sais pas comment.

-

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 ensuite complètement, ce que je ne veux pas.

En dehors de cela, je suis coincé. Comment dois-je répliquer comment cela fonctionnait à l'origine (ou le faisais-je de la mauvaise façon depuis le début!). Toute aide est très appréciée!

33
Jordan Smith

Mec, je suis tombé sur 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, cela ne renverra plus le contrôleur de vue de présentation.

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

J'utilise ShareKit, et le modalViewController fonctionnait parfaitement dans iOS4, mais dans iOS5, il ne se rejettera tout simplement pas! En effet, dans leur code, ils utilisent:

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

et parentViewController renverra nil, car il s'agit d'un contrôleur de vue présenté modal ...

En cherchant une solution, j'ai trouvé votre question .. J'ai donc décidé de la régler 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 vous interprétez la question d'origine, il y a deux réponses. Voici la seconde:

Dans iOS5, il semble que le contrôleur modal ne se rejette que lorsque vous cliquez sur la boucle, mais pas au-dessus de la boucle ou de l'arrière-plan. Dans iOS5, afin d'obtenir réellement la vue modale pour se rejeter lorsque vous appuyez sur l'arrière-plan ou au-dessus de la boucle, j'ai ajouté le code suivant au contrôleur, pour écouter les taps sur la vue modale, mais ignorer les taps sur les boutons. Cela devrait imiter le comportement dans la version précédente d'iOS lorsque vous travaillez avec un contrôleur modal avec une boucle de page.

- (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];
}
71
Mazyod

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

[self.parentViewController dismissModalViewControllerAnimated: YES];

cela ne fonctionne pas sur toutes les versions du système d'exploitation. Cependant, ceci:

[self dismissModalViewControllerAnimated: YES];

devrait.

15
Ben Gottlieb

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

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

Je le corrige avec un observateur, ajoutant ceci où vous avez été renvoyé:

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

Et cela dans le contrôleur de vue parent 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];
1
Luis Ascorbe

Cela semble fonctionner sur la (maintenant version finale de) ios 5.

Je remarque que vous devez appuyer sur une région spécifique pour ignorer le recourbement de la page - le fait de toucher près des bords de la partie supérieure de l'écran ne semble rien faire, mais la section centrale floue au-dessus du graphique de recourbement de la page entraîne systématiquement le rejet la vue modale.

Je ne sais pas si ce comportement de région de prise étroite est nouveau pour ios 5 ou existait déjà et je ne l'avais jamais remarqué auparavant. J'espère que cela vous sera utile!

0
benvolioT

Dans iOS5, il semble que le contrôleur modal ne se rejette que lorsque vous cliquez sur la boucle, mais pas au-dessus de la boucle ou de l'arrière-plan. Dans iOS5, afin d'obtenir réellement la vue modale pour se rejeter lorsque vous appuyez sur l'arrière-plan ou au-dessus de la boucle, j'ai ajouté le code suivant au contrôleur, pour écouter les taps sur la vue modale, mais ignorer les taps sur les boutons. Cela devrait imiter le comportement de la version précédente d'iOS lorsque vous travaillez avec un contrôleur modal avec une boucle de page.

- (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];
}
0
user468687

Merci les gars, cela m'a fait gagner beaucoup de temps. Je viens de remarquer que les méthodes presentModalViewController et dismissModalViewController sont obsolètes en fonction du code source de UIViewControoler.h. Il existe d'autres méthodes presentViewController et dismissViewController.

0
Linda Saul