Ouverture de modale depuis une méthode delegate

muqaddarmuqaddar Administrateur
23:03 modifié dans API UIKit #1
Salut,

Petite colle du soir.  ???

J'appelle une méthode delegate depuis un view controller déjà  ouvert sous forme de de modale.

- (IBAction)wantToAddBottles:(id)sender<br />{&nbsp; <br />&nbsp; [self.finderDelegate loadBottleViewControllerWithBottleUUID:nil forWineUUID:self.wine.uuid];<br />&nbsp; [self dismissModalViewControllerAnimated:YES];<br />}


Donc j'appelle ma méthode et je ferme la modale en cours.

Or, la modale se ferme bien, la méthode delegate est bien appelée (j'ai fait du ligne à  ligne dans le débugueur), tous les objets sont instanciés... mais rien ne se passe: dans cette méthode delegate, je veux ouvrir une autre modale.

- (void)loadBottleViewControllerWithBottleUUID:(NSString*)bottleUUID forWineUUID:(NSString*)wineUUID<br />{<br />&nbsp; Bottle *bottle = nil;<br />&nbsp; <br />...<br />&nbsp; <br />&nbsp; BottleViewController *bottleViewController = [[BottleViewController alloc] initWithNibName:[NSString stringWithFormat:@&quot;%@~%@&quot;, @&quot;BottleViewController&quot;, DEVICE] bundle:nil];<br />&nbsp; bottleViewController.finderDelegate = self;<br />&nbsp; bottleViewController.bottle = bottle;&nbsp; <br />#ifdef TARGET_OS_PAD<br />	bottleViewController.modalPresentationStyle = UIModalPresentationPageSheet;<br />&nbsp; [self presentModalViewController:bottleViewController animated:YES]; <br />#endif&nbsp; <br />	[bottleViewController release];&nbsp; &nbsp; <br />}<br />


Donc lorsque je passe la ligne presentModaleViewController, rien ne se passe...
Je sèche un peu, d'autant que je suis presque sûr d'avoir déjà  appelé une ouverture de modale au controller parent juste avant de fermer la modale déjà  ouverte.

Donc pour l'instant, la modale en cours est fermée, et rien d'autre ne se passe.

Réponses

  • 23:03 modifié #2
    Si tu veux que ça fonctionne, il faudrait que ton dismiss juste avant soit animated:NO. Dans ce cas il pourra afficher ta modal.
    En tout cas dans ce genre de cas, il faut peut-être revoir ton pattern.
  • muqaddarmuqaddar Administrateur
    23:03 modifié #3
    dans 1320712455:

    Si tu veux que ça fonctionne, il faudrait que ton dismiss juste avant soit animated:NO. Dans ce cas il pourra afficher ta modal.


    Tu te doutes que j'ai essayé... ;)
    J'ai aussi essayé avec le dismiss avant.

    dans 1320712455:

    En tout cas dans ce genre de cas, il faut peut-être revoir ton pattern.


    J'y ai longuement réfléchi, et pour mon cas je trouvais que ce choix était logique.
  • muqaddarmuqaddar Administrateur
    23:03 modifié #4
    Bon, j'ai changé d'avis finalement.
    J'ouvre la deuxième modale sans fermer la première.

    J'avais souhaité fermer la première parce que depuis le premier écran on ouvre également la "deuxième modale" en mode édition, et ce directement. Donc je voulais tout mettre sur le même plan. Qu'une fenêtre puisse être ouverte uniquement du même endroit.

    Mais bon, bien que changeant d'avis, si quelqu'un a une idée de savoir pourquoi rien ne se passait dans le cas 1), qu'il se manifeste. :)
  • novembre 2011 modifié #5
    dans 1320737492:

    Mais bon, bien que changeant d'avis, si quelqu'un a une idée de savoir pourquoi rien ne se passait dans le cas 1), qu'il se manifeste. :)


    Bha je te l'ai expliqué  ???
    C'est vraiment pas nouveau qu'on ne puisse pas enchaà®ner un dismissModalAnimated:YES + presentModalAnimated:YES. J'avais le même problème sous iOS 3 (voir avant!)
    Après, j'ai bien envie de dire que c'est un bug de la part d'Apple..
  • muqaddarmuqaddar Administrateur
    23:03 modifié #6
    Ah ok, je n'avais pas compris que ça ne marchait pas. Je pensais que je m'y prenais mal.
    En effet, je ne trouve aucune raison logique pour que ça ne marche pas.
  • 23:03 modifié #7
    dans 1320740908:

    Ah ok, je n'avais pas compris que ça ne marchait pas. Je pensais que je m'y prenais mal.
    En effet, je ne trouve aucune raison logique pour que ça ne marche pas.

    La seule raison logique c'est que totoController.modalViewController existe encore au moment où tu appelles ton presentModalViewController:animated:
    Le problème c'est qu'Apple aurait du gérer un système de cached-view au moment où on appelle dismissModalViewControllerAnimated: et immédiatement mettre xx.modalViewController à  nil.
  • muqaddarmuqaddar Administrateur
    23:03 modifié #8
    J'ai trouvé une astuce du bricolo codeur du dimanche, et je dois dire que ça marche très bien sur iPad et iPhone...

    - (void)loadPlacerViewControllerAndShowBottleInCellar:(NSString*)bottleUUID<br />{<br />&nbsp; [self performSelector:@selector(loadPlacerToShowBottleInCellar:) withObject:bottleUUID afterDelay:0.5f];<br />}<br /><br />- (void)loadPlacerToShowBottleInCellar:(NSString*)bottleUUID<br />{<br />&nbsp; PlacerViewController *placerViewController = [[PlacerViewController alloc] initWithNibName:[NSString stringWithFormat:@&quot;%@~%@&quot;, @&quot;PlacerViewController&quot;, DEVICE] bundle:nil];<br />&nbsp; placerViewController.finderDelegate = self;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; [self presentModalViewController:placerViewController animated:YES]; <br />&nbsp;  <br />&nbsp; [placerViewController showBottleInCellarWithBottleUUID:bottleUUID needToPush:YES];&nbsp; &nbsp; <br />&nbsp; [placerViewController release];&nbsp; &nbsp; &nbsp;  <br />}
    


    Je délai de 0.5 seconde semble être un minimum... donc ça reste bancal.
  • muqaddarmuqaddar Administrateur
    23:03 modifié #9
    J'ai trouvé bien mieux.

    Depuis la première modale ouverte, utiliser la méthode viewDidDisappear, et une ivar en plus:

    - (IBAction)showInCellar:(id)sender<br />{	&nbsp; <br />&nbsp; self.wantToShowInCellar = YES;&nbsp; <br />&nbsp; [self dismissModalViewControllerAnimated:YES];	<br />}<br /><br />- (void)viewDidDisappear:(BOOL)animated<br />{<br />&nbsp; [super viewDidDisappear:animated];<br />&nbsp; <br />&nbsp; if (self.wantToShowInCellar)<br />&nbsp; {<br />&nbsp; &nbsp; [self.finderDelegate loadPlacerViewControllerAndShowBottleInCellar:self.bottle.uuid];&nbsp; &nbsp; &nbsp;  <br />&nbsp; } <br />}
    


    ça marche nikel, et c'est moins bricolo. :)
  • AliGatorAliGator Membre, Modérateur
    23:03 modifié #10
    Oui problème classique comme l'a expliqué Louka, et la seule solution si tu veux vraiment ce comportement est de déclencher le presentModal de l'autre modale seulement une fois que la première modale a fini d'être dismissée (comme tu as fait avec ton viewDidDisappear). Mais bon, c'est pas nouveau :P
  • muqaddarmuqaddar Administrateur
    23:03 modifié #11
    dans 1320757359:

    Mais bon, c'est pas nouveau :P


    Je ne l'avais pas encore expérimenté. ;)
Connectez-vous ou Inscrivez-vous pour répondre.