Problèmes implémentation ModalView

remoozremooz Membre
10:19 modifié dans API UIKit #1
Je souhaite implémenter une modal view dans mon appli mais j'ai un petit souci. Celle-ci ne s'affiche pas.

La structure de mon appli est la suivante :
-> Tab Bar Controller
      Tab Bar
      -> Navigation Bar Controller
          Navigation Bar
          -> View Controller

J'ai une appli basé sur un projet Tab Bar. J'ai chaque vue Tab Bar est une Nav Bar. Je souhaite avoir une modal view lorsque je clique sur le bouton gauche de la nav bar mais cela ne fonctionne pas.
J'ai suivi le tutoriel du forum mais il est fait pour une appli avec seulement une nav bar.

Mon code d'implémentation est le suvant :
- (IBAction)modalViewAction:(id)sender<br />{ <br />	if(!modalViewController)<br />	{<br />		modalViewController=[[ModalViewController alloc] initWithNibName:@&quot;ModalViewController&quot; bundle:nil];<br />	}<br />	<br />	[self.tabBarController presentModalViewController:modalViewController animated:YES];<br />}

   
Merci par avance pour votre aide :)

Réponses

  • Philippe49Philippe49 Membre
    10:19 modifié #2
    Au point de vue conceptuel, le bouton gauche de la nav bar est faite pour remonter dans la hiérarchie des vues, et un utilisateur attendra ce comportement "standard". Il n'est donc pas étonnant que tu rencontres des difficultés à  mettre en place ce comportement atypique. 

    The UINavigationBar class implements a control for navigating hierarchical content. It's a bar, typically displayed at the top of the screen, containing buttons for navigating up and down a hierarchy. The primary properties are a left (back) button, a center title, and an optional right button. You can specify custom views for each of these.


    Cependant, tout view controller peut présenter une modal view. Si ta modalViewAction est définie dans le view controller qui présente la vue (est sur le dessus de la pile), et que le bouton est connecté vers ce view controller, alors un :
    [self presentModalViewController:modalViewController animated:YES];
    doit fonctionner.

  • remoozremooz Membre
    10:19 modifié #3
    En fait ma modalViewAction est définie dans le navigationController qui lui même est contenu dans un tabBarController. Le bouton est relié au navigatioController.

    J'ai testé :
    [self presentModalViewController:modalViewController animated:YES];
    

    mais ça ne fonctionne pas mieux.

    Dans l'implementation de mon navigationController, j'ai :
    - (IBAction)modalViewAction:(id)sender<br />{ <br />	if(!modalViewController)<br />	{<br />		modalViewController=[[ModalViewController alloc] initWithNibName:@&quot;ModalViewController&quot; bundle:nil];<br />	}<br />	<br />	[self presentModalViewController:modalViewController animated:YES];<br />}
    


    Et dans le modalViewController, j'ai :
    - (IBAction)dismissAction:(id)sender <br />{<br />	[self.tabBarController dismissModalViewControllerAnimated:YES];<br />}
    

  • Philippe49Philippe49 Membre
    10:19 modifié #4
    Première vérification à  faire : l'action est-elle appelée conformément à  ce que l'on croà®t ?
     
    - (IBAction)modalViewAction:(id)sender
    {
    NSLog(@modal view action);
    if(!modalViewController)
    {
    modalViewController=[[ModalViewController alloc] initWithNibName:@ModalViewController bundle:nil];
    }

    [self presentModalViewController:modalViewController animated:YES];
    }


    si oui, c'est que le UINavigationController (c'est bien la classe dont hérite ton navigationController ?) présente la modal view, mais ce n'est pas visible.
  • remoozremooz Membre
    10:19 modifié #5
    - (IBAction)modalViewAction:(id)sender<br />{ <br />&nbsp; &nbsp;if(!modalViewController)<br />&nbsp; &nbsp;{<br />&nbsp; &nbsp; &nbsp; modalViewController=[[ModalViewController alloc] initWithNibName:@&quot;ModalViewController&quot; bundle:nil];<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;<br />&nbsp; &nbsp;[self.tabBarController.navigationController presentModalViewController:modalViewController animated:YES];<br />}
    


    Dans ce cas, l'appli ne plante pas. Par contre si je fais self, self.tabBarController ou encore self.navigationController l'appli plante.

    Comme tu l'as suggérer peut-être que la modalView n'est pas visible. Y a-t-il un moyen de la rendre visible ?
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #6
    Je comprends mal la structure :

    -> Tab Bar Controller
           Tab Bar
           -> Navigation Bar Controller
              Navigation Bar
              -> View Controller

    La tab bar controller pilote en fait un tableau de view controllers (ils sont où dans ton arborescence ci-dessus?), et on peut accepter que l'un de ces view controller présente une Navigation Bar.
    -> Tab Bar Controller
           Tab Bar
           -> First View Controller
           -> Second View Controller

    et la navigation bar apparaà®t dans le xib du Second View Controller et dans les fils de celui-ci


    Bon, mais pourquoi pas ? 
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #7
    Bon un peu d'action et je comprends mieux

    J'ai défini
    -> UITabBarController
           Tab Bar
           -> MyNavigationController (fisrt tab)
           -> SecondViewController (second tab)

    MyNavigationController présente la vue d'un xib RootView.xib, qui est pilotée par un RootViewController.
    La classe  MyNavigationController possède une variable d'instance modalViewController, de clas ModalViewController, associé à  un xib ModalView.xib

    Un bouton de la barre de navigation lance l'action de présentation de la modal view
    <br />-(IBAction) action:(id) sender {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // action de MyNavigationController<br />	if(!modalViewController)<br />		{<br />				modalViewController=[[ModalViewController alloc] initWithNibName:@&quot;ModalView&quot; bundle:nil];<br />		}<br />		<br />	[self presentModalViewController:modalViewController animated:YES];	<br />}
    


    Un bouton de la modal view la fait disparaà®tre.
    <br />- (IBAction)dismiss:(id)sender{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // action de ModalViewController<br />	// Retirer la vue <br />	[self.parentViewController dismissModalViewControllerAnimated:YES];<br />}
    


  • Philippe49Philippe49 Membre
    10:19 modifié #8
    Il faut remarquer que si on ajoute dans la méthode action présentant la vue modale :
    NSLog(@%@",modalViewController);
    NSLog(@%@",self.modalViewController);
    les vues référencées sont les mêmes.

    #import &lt;UIKit/UIKit.h&gt;<br />@class ModalViewController;<br /><br />@interface MyNavigationController : UINavigationController {<br />	ModalViewController * modalViewController;<br />}<br /><br />-(IBAction) action:(id) sender;<br />@end<br />
    

  • remoozremooz Membre
    10:19 modifié #9
    Mon xib a cette tête là  :
    image1ku6.th.png
  • Philippe49Philippe49 Membre
    10:19 modifié #10
    Cela correspond à  mes deux posts précédents. Je te joins le mini-projet d'essai
  • remoozremooz Membre
    10:19 modifié #11
    Merci pour ton mini projet.

    J'ai donc pu comparer avec le mien et j'ai exactement la même chose sauf que mon appli plante. J'ai l'impression que c'est au niveau du nom du xib de la modalView dans la méthode action. Pourtant les noms correspondent bien.
  • Philippe49Philippe49 Membre
    10:19 modifié #12
    Un problème de gestion mémoire dans le ModalViewController ?

    C'est quoi le message d'erreur ?
  • remoozremooz Membre
    10:19 modifié #13
    Ayé c'est réglé, ça fonctionne.  :adios!:

    J'ai copié ta modalView.xib à  la place de la mienne et ça marche impec.

    Merci beaucoup pour ton aide  :)

    Question subsidiaire : il est possible d'avoir la modal view déjà  apparente au lancement de l'appli ?
  • Philippe49Philippe49 Membre
    10:19 modifié #14
    dans 1233268107:

    Question subsidiaire : il est possible d'avoir la modal view déjà  apparente au lancement de l'appli ?

    Regarde du côté des méthodes du protocole UIApplicationDelegate pour intervenir au moment opportun.
  • remoozremooz Membre
    10:19 modifié #15
    J'ai la méthode qui agit au lancement de l'application :
    - (void)applicationDidFinishLaunching:(UIApplication *)application <br />{<br />	// Add the tab bar controller&#39;s current view as a subview of the window<br />&nbsp; &nbsp; [window addSubview:tabBarController.view];<br />}
    

    J'ai cherché dans les docs du SDK et impossible de trouver une info sur ça. Je ne vois pas du tout quoi mettre dans cette méthode.

  • Philippe49Philippe49 Membre
    10:19 modifié #16
    Comme son nom l'indique, cette méthode est appelée lorsque l'application a fini son installation. C'est donc un moment propice pour ajuster la présentation initiale.
    En installant dans l'interface de NetStatAppDelegate un IBOutlet vers le NavigationController, en connectant dans IB cet outlet, tu peux lancer la modal view par appel de la méthode associée

    - (void)applicationDidFinishLaunching:(UIApplication *)application <br />{<br />	// Add the tab bar controller&#39;s current view as a subview of the window<br />&nbsp; &nbsp; [window addSubview:tabBarController.view];<br />	// Déclencher le mécanisme de la modal view en appelant la méthode dédiée<br />&nbsp; &nbsp; [fisrtNavigationController action:self];<br />}
    

  • remoozremooz Membre
    10:19 modifié #17
    Merci pour tout, ça fonctionne nickel  :kicking:
Connectez-vous ou Inscrivez-vous pour répondre.