Besoin d'eclairage sur certain points :)

guittonewsguittonews Membre
mars 2009 modifié dans API UIKit #1
Salut à  tous,
cela fait quelques semaines que je n'ai pas mis les mains dans le cambouis pour laisser murir les choses que j'avais appris. Cela à  porter ses fruits notamment au niveau d'IB que je n'arrivait pas à  utiliser lors de mes premiers pas.

cependant je rencontre un problème au moment de "lier" IB et le code. Par exemple je créé une application tabbar, qui dans chacun des tab contient une navbar et une tableview. Comment associer un data source à  chaque tableview? ou? comment? c'est juste une question de nommage de mes classes? pareil pour les delegates?

Merci d'avance pour tout vos conseils qui m'ont toujours aidé à  y voir plus clair dans ce monde (qui à  l'air) fabuleux :)

PS: ci - joint le projet de base sur lequel j'aimerai m'appuyer et qui illustrera mes propos :)

PS 2 : petite précision, le projet est juste là  pour illustrer je ne vous demande bien sûr pas de me le faire :)

Réponses

  • Philippe49Philippe49 Membre
    13:31 modifié #2
    Ta question est peu précise , il y a de multiples façons de faire cela.
    • Cela peut-être un UIViewController avec un nib par page, connexion du datasource et delegate dans ce nib.
    • Un UIViewController perso sous-classé selon les différentes 'tab', avec encore l'option d'un nib commun, ou un nib par 'tab'
    • ...

    Il faut faire un projet sur papier avant tout cela en prenant des décisions qui permettent des évolutions futures "faciles" à  réaliser ...

     
  • NseaProtectorNseaProtector Membre
    13:31 modifié #3
    Moi je ne saurais trop te conseiller "Cocoa programming" et notamment l'exemple "employee".
  • guittonewsguittonews Membre
    mars 2009 modifié #4
    Bonjour et merci d'avoir répondu :)

    C'est vrai que je n'ai pas était très clair... :crackboom:-

    Je reprend donc :)

    J'ai une tabbar avec trois items. Dans chacun de ces items je voudrais une navbar. Et enfin dans chacune de ces navbar une table view.
    Ce que j'ai reussi à  faire d'une seule manière : dans un seul nib. (A partir du moment ou un item de mon tab bar pointe vers un autre nib qui contient un navigationcontroller ca plante...).
    Bref, j'ai donc mon nib avec ma tabBar, qui pour chaque item contient un navigationController.
    Chacun de mes navigationController contient un tableViewcontroller. Jusque là  ca marche.

    Par simplicité je me concentre maintenant sur un de ces items, disons "settings".

    Je crée une classe SettingsTableViewController et je l'ajoute à  mon nib. Puis réalise les connexions pour le dataSource et le delegate.
    Jusque là  toujours pas de problème ma tableView se met bien à  jour en fonction de mon dataSource.

    Maintenant j'aimerais que quand une ligne est selectionnée une nouvelle vue s'affiche, via le navigation item. Et c'est là  que ça coince...Je n'arrive pas à  récupérer mon navigationController. J'ai mis 3 log à  ce niveau là  (didSelectRowAtIndexPath) dont voici les traces :

    2009-03-17 10:33:55.104 speedsmos[821:20b] Vue pushée = &lt;LoginViewController: 0x5402b0&gt;<br />2009-03-17 10:33:55.105 speedsmos[821:20b] Self = &lt;SettingsTableViewController: 0x523380&gt;<br />2009-03-17 10:33:55.106 speedsmos[821:20b] Navigation controller? = (null)
    
    .

    Ils correspondent respectivement à  :
    <br />NSLog(@&quot;Vue pushée = %@&quot;,loginVC);<br />NSLog(@&quot;Self = %@&quot;,self);<br />NSLog(@&quot;Navigation controller? = %@&quot;,[self navigationController]);
    


    Je reste à  votre écoute pour toutes vos remarques, suggestions, questions qui pourraient vous aider à  m'aider...

    Merci beaucoup d'avance  :why?:

    [EDIT] le projet que j'avais mis a disposition dans mon premier post n'est pas à  jour par rapport à  ce que je décris ici, j'ai avancé sur certain problème depuis. Je serais ravis de le mettre à  votre dispostion si certain veulent me faire des commentaires pour m'ameliorer....[/EDIT]
  • guittonewsguittonews Membre
    13:31 modifié #5
    coucou tout le monde :)

    J'ai un peu de nouveau  :kicking:

    vu que je n'avait pas d'objet "parent" j'ai récupéré le delegate de l'application pour reparcourir mes controller depuis le haut.
    (Pas très satisfaisant comme solution mais ca avance au moins...)

    Et ca marche :DDDDDDD

    si quelqu'un veut jeter un oeil pour voir si c'est vraiment crado ou pas je suis pas contre :)
  • Philippe49Philippe49 Membre
    13:31 modifié #6
    :) coucou pareil  :)



    [size=12pt]Pour mémoire, on devrait pouvoir utiliser ici la property navigationController[/size]

    navigationController
    A parent or ancestor that is a navigation controller. (read-only)

    @property(nonatomic, readonly, retain) UINavigationController *navigationController
    Discussion
    Only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found.


    Ceci dit le mélange que tu fais entre navigation par TabBar et navigation par NavigationController doit au minimum perturber le mécanisme. Il ne doit pas falloir disposer l'architecture n'importe comment, j'essaie ce soir ...

    [size=12pt]Les notifications[/size]
    Pour communiquer d'un objet B vers un objet A avec lequel il n'y a pas de connexion directe on dispose également du principe des notifications :

    1) On inscrit l'objet en question pour recevoir une certaine notification, identifiée par un nom  :
    extern NSString * MyNotification ;<br /><br />@implementation ...<br /><br />	NSNotificationCenter * defaultCenter = [NSNotificationCenter defaultCenter];<br />	[defaultCenter addObserver:self selector:@selector(myAction:)&nbsp; &nbsp;name:MyNotification object:nil];<br />
    


    2) On prévoit de supprimer cette inscription dans le dealloc

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    



    3) L'objet B qui veut communiquer envoie un message via l'intermédiaire du defaultCenter :

    NSString * MyNotification=@&quot;Notification pour revenir au parent&quot; ;<br /><br />@implementation ...<br />	NSNotificationCenter * defaultCenter = [NSNotificationCenter defaultCenter];	<br />	NSDictionary *dico = [NSDictionary dictionaryWith .......]; // optionnel, peut être nil<br />	[defaultCenter postNotificationName: MyNotification&nbsp; object:self userInfo:dico];
    





  • guittonewsguittonews Membre
    13:31 modifié #7
    Pour mémoire, on devrait pouvoir utiliser ici la property navigationController

    navigationController
    A parent or ancestor that is a navigation controller. (read-only)

    @property(nonatomic, readonly, retain) UINavigationController *navigationController
    Discussion
    Only returns a navigation controller if the view controller is in its stack. This property is nil if a navigation controller cannot be found.

    Ceci dit le mélange que tu fais entre navigation par TabBar et navigation par NavigationController doit au minimum perturber le mécanisme. Il ne doit pas falloir disposer l'architecture n'importe comment, j'essaie ce soir ...


    Oui c'est la dessus que j'étais parti avant de tester la solution par le delegate...

    En ce qui concerne les notifications ca me parait sympa. Je le garde de coté car mon "faible" niveau me fait peur...à  chaque fois que je test quelque chose de nouveau j'y passe trois jours et là  j'ai besoin d'avancer. Cependant au prochain blocage je reviendrais là  dessus.


    Merci philippe pour tes conseils toujours avisés 

    Puis allé c'est la St patrick biere pr tout le monde  :p
  • Philippe49Philippe49 Membre
    mars 2009 modifié #8
    Ok pour la bière    :p

    Je propose l'architecture suivante pour l'association tabBar/NavBar

    - Dans le tableau du TabBarController, on place un SecondViewController (UIViewController) de nib SecondView.xib

    - SecondView.xib contient un UINavigationController, IBOutlet du secondViewController. Il est chargé dans viewDidLoad: par
    &nbsp;- (void)viewDidLoad {<br />	[super viewDidLoad];<br />	CGRect frame=navigationController.view.frame;<br />	frame.origin.y=0.;<br />	navigationController.view.frame=frame;<br />	<br />	[self.view addSubview:[navigationController view]];<br />}&nbsp; &nbsp;
    


    - UINavigationController contient un SecondTableViewController héritant de UITableViewController dont le nib est SecondTable.xib, dont la vue est une UITableView

    - Ce secondTableviewController implémente tableView: didSelectRowAtIndexPath: et crée un AnotherViewController, dont le nib est AnotherView.xib     
    AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@&quot;AnotherView&quot; bundle:nil];<br />	[self.navigationController pushViewController:anotherViewController animated:YES ];<br />	[anotherViewController release];
    



    rq: Il faut redimensionner [navigationController view] pour la gestion correcte de la status bar.



Connectez-vous ou Inscrivez-vous pour répondre.