Probléme affichage de View

cSilascSilas Membre
04:19 modifié dans Vos applications #1
Bonjour a tous,

Je viens vers vous, car j'ai un problème sur mon application.
Je vais essayer d'être précis dans mon explication.

Donc, j'ai un bouton 'Stock' dans mon DetailsViewController, qui me permet d'afficher les résultats de la requete (réponse webservice) dans mon RésultatViewController.

Voici la hierarchie des vues : J'ai Mon résultatViewController qui posséde une tableView avec l'ensemble des resultats. Lorsque je clique sur une des annonces de ResultatViewController, la vue DetailsViewController est chargé avec l'ensemble des données correspondante et le bouton stock. Lorsque je clique sur le bouton stock, ceci marche tres bien et me lance la vue.

Cependant, lorsqu'une annonce est chargée dans "DetailsController", il est possible de changer d'annonce par le biais de bouton Precedent/Suivant afin d'éviter de faire retour et de cliquer sur la cell suivante ou précedente. La est mon probléme. Lorsque je charge une annonce et que je fais suivant ou precedent. LE bouton stock s'éxecute mais la View ne s'affiche pas.

Voici mon code :

Code du bouton:
-(void)launchSearchByAdSourceID:(NSNumber*)currentAdSourceId andName:(NSString *)currentAdSourceName<br />{<br />	//Set AdSourceID<br />	[searchArgsByID setObject:currentAdSourceId forKey:K_SOURCE_ADID];<br />&nbsp; &nbsp; [searchArgsByID setObject:currentAdSourceName forKey:K_SOURCE_NAME];<br />&nbsp; &nbsp; [searchArgsByID setObject:@&quot;YES&quot; forKey:@&quot;isStockClick&quot;];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //Init the results screen with the research arguments<br />&nbsp; &nbsp; parentController = [[COResultsController alloc] initWithResearch:searchArgsByID];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //Display the results screen<br />&nbsp; &nbsp; [self.navigationController pushViewController:parentController animated:YES]; <br />}<br />



Code du bouton Next:
//Same behavior for next ad<br />-(void)askNext <br />{<br />	NSDictionary * next = [resultsController getNext];<br />	if(next) <br />&nbsp; &nbsp; {<br />		currentAd = next;<br />		newDetails = [[CODetailsController alloc] initWithAd:currentAd navigatorDelegate:resultsController financeAndInsuranceController:financeAndInsuranceController];<br />		[UIView beginAnimations:nil context:NULL];<br />		[UIView setAnimationDuration:0.75];<br />		[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:NO];<br />		<br />&nbsp; &nbsp; &nbsp; &nbsp; newDetails.parentController = self.parentController;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />		[detailsTableView removeFromSuperview];<br />		[self.view addSubview:newDetails.view];<br /><br />		[UIView commitAnimations];<br />&nbsp; &nbsp; }<br />}<br />


Je ne sais pas si je suis bien clair. Mais si vous avez des questions n'hésitez pas.

Cordialement.

Réponses

  • cSilascSilas Membre
    04:19 modifié #2
    Petite précision,

    la ligne suivante :
    //Display the results screen<br />&nbsp; &nbsp; [self.navigationController pushViewController:parentController animated:YES];<br />
    


    J'ai pu voir, que self.navigationController = null. C'est la raison pour laquelle il n'affiche pas la View. Pourquoi mon navigationController passe a null?

    Cordialement.
  • CéroceCéroce Membre, Modérateur
    04:19 modifié #3
    dans 1308150172:

    J'ai pu voir, que self.navigationController = null. C'est la raison pour laquelle il n'affiche pas la View. Pourquoi mon navigationController passe a null?

    Certainement parce que le view controller n'est pas géré par le navigation controller (il n'est pas "dedans"). (Supposition de ma part).
  • cSilascSilas Membre
    04:19 modifié #4
    Bonjour Céroce,

    Cependant, cela marche la premiere fois. Tant que je ne change pas d'annonce directement dans detailsViewController sa marche parfaitement (mais un peu chiant de devoir faire retour et sélectionner une autre annonce).



  • CéroceCéroce Membre, Modérateur
    04:19 modifié #5
    À vrai dire, je suis un peu perdu dans ton code à  cause de la manière dont tu nommes les objets, mais tes explications sont plutôt claires.

    D'après ce que je comprends, tu devrais avoir une hiérarchie comme celle-ci:
    NavigationController
    empile ResultatViewController
    empile DetailsViewController
    contient PageViewController

    D'après ce que je comprends, tu n'as pas encore de PageViewController. Quoi qu'il en soit, PageViewController aura self.navigationController = nil, parce qu'il n'est pas sur la pile du navigation controller.
    ça n'a rien de magique, la propriété navigationController est positionnée par le navigation controller lui-même quand il empile un contrôleur.

  • cSilascSilas Membre
    04:19 modifié #6
    Désolé pour le code, mais c'est une application que je viens de reprendre et je dois y ajouter des fonctionnalités à  l'existant.

    Voici, ma hiérarchie (pour cela j'ai fait un NSLog au niveau du code du bouton "Stock") :
    <br />self.navigationController.viewControllers : (<br />&nbsp; &nbsp; &quot;&lt;COFavoriteResearchesController: 0x5d660e0&gt;&quot;,<br />&nbsp; &nbsp; &quot;&lt;COResultsController: 0x702fb10&gt;&quot;,<br />&nbsp; &nbsp; &quot;&lt;CODetailsController: 0x5d75e20&gt;&quot;<br />)<br />
    



    Ce que tu appelles la PageViewController, j'ai moi CODetailsController.

    Comment peut-on faire pour l'ajouter dans la pile du navigationController ? Car pour être sincére, je suis perdu avec le NavigationController.

    Cordialement.
  • CéroceCéroce Membre, Modérateur
    04:19 modifié #7
    OK.
    Le fonctionnement du Navigation Controller est très simple: il maintient une pile de view controllers.
    [tt]pushViewController:animated:[/tt] place un view controller sur le haut de la pile.
    [tt]popViewControllerAnimated[/tt]: retire le view controller du haut de la pile.

    D'après ton log, les 3 view controllers sont sur la pile. Ce qui est cohérent par rapport au fonctionnement d'autrefois.
    La manière la plus directe de gérer le bouton Next serait de mettre CODetailsController en cible du bouton, de changer de modèle courant (ce que tu fais par [resultsController getNext]) et de raffraichir CODetailsController.

    Cependant, dans ton cas, tu veux que la nouvelle page se place avec une animation. Ce que tu fais est que tu charges un nouveau CODetailsController et substitue sa vue à  celle de l'ancien. De fait, le nouveau CODetailsController n'est pas sur la pile du navigation controller (l'ancien y est!), et forcément sa propriété navigationController est nulle.

    Ce qu'il faut faire est créer une nouvelle classe view controller intermédiaire entre COResultsController et CODetailsController. Ce contrôleur sera poussé sur la pile par COResultsController. Il sera la cible des boutons Previous et Next. Lorsqu'il est poussé ou que l'un des boutons est touché, il chargera un CODetailsController et lui passera le modèle à  afficher.
  • cSilascSilas Membre
    04:19 modifié #8
    Bonjour Céroce,

    Je viens de résoudre mon problème.
    Il fallait que je mette non pas :
    self.navigationController
    


    mais

    [financeAndInsuranceController.navigationController pushViewController:parentController animated:YES];
    



    Je suppose que la personne avant moi, avait eu des problémes du même type.


    En tous cas, merci pour tes réponses. Cela ma permis de trouver mon erreur plus rapidement. Et merci pour les explications sur la Navigation Controller.

    Cordialement.
  • CéroceCéroce Membre, Modérateur
    04:19 modifié #9
    À mon avis,  ton problème n'est pas vraiment réglé.
    De plus, lance un coup d'Instruments/Leaks, tu as certainement des fuites mémoire.
Connectez-vous ou Inscrivez-vous pour répondre.