Rafraichir tableView

CeetixCeetix Membre
23:08 modifié dans API UIKit #1
Salut tout le monde.
VOilà  j'ai un petit probème. J'ai une tabBar qui contient des tableView. Tout est chargé des le démarrage dans le delegate. En suite je fais un ajout dans un BDD et le resultat doit se voir sur une tableView. Le soucis c'est qu'il faut que je redémarre l'app pour que le résultat se voit. J'ai eu beau faire :

<br />/* Notre méthode se trouvant dans le delegate on déclare une variable de cette classe */<br />&nbsp; &nbsp; iOrygeenAppDelegate *appDelegate = (iOrygeenAppDelegate *)[[UIApplication sharedApplication] delegate];<br />&nbsp; &nbsp; /* j&#39;insere, les résultats devant s&#39;afficher sur mes ligne de tableView */<br />&nbsp; &nbsp; [appDelegate insererBDD:selectedAliment withGlucide:glu protide:pro lipide:lip kCalori:kcal andDate:theDate];<br />&nbsp; &nbsp;  <br />&nbsp; &nbsp; /*je rafraichi justement mon tableView */<br />&nbsp; &nbsp; InfoViewController *monInfoController = [[InfoViewController alloc]init];<br />&nbsp; &nbsp; [monInfoController.infoTable reloadData];<br /> <br />&nbsp;  /* rien à  faire ça veut pas ... */<br />


et ensuite dans mon InfoViewController :

<br />-(void)viewWillAppear {<br />&nbsp; &nbsp; [self.infoTable reloadData];&nbsp;  <br />}<br />


Mais comme tout est chagé au départ ça ne sert à  rien ce n'est pas ré-appelé...
Auriez-vous une idée?  :-\\
Merci !
«1

Réponses

  • 23:08 modifié #2
    Un bug du SDK 3.0?  :o Télécharge la beta 3.1 et regarde si c'est pareil
  • muqaddarmuqaddar Administrateur
    23:08 modifié #3
    Je pense pas à  un bug, mais plutôt à  un prolème d'organisation/conception de ton code.
    Tu rafraà®chis ton tableView mais à  mon avis il manque du code pour rafraà®chir son datasource, c'est lui qui est mis à  jour. Et je suppose que le datasource est alimenté par la BDD donc même si la BDD a évolué, il faut rafraà®chir aussi le datasource.
  • CeetixCeetix Membre
    23:08 modifié #4
    Tu le rafraichi comment le datasource ?
  • muqaddarmuqaddar Administrateur
    23:08 modifié #5
    dans 1246436097:

    Tu le rafraichi comment le datasource ?


    Je dirais plutôt, comment le remplis-tu toi ?
  • CeetixCeetix Membre
    23:08 modifié #6
    je le remplis dans mon AppDelegate, quand l'application s'ouvre en faisant appel à  une méthode de lecteur dans la BDD :

    <br />	[self readHistoriqueFromDatabase]; // remplit un NSMutableArray<br />
    


    <br />jourViewController = [[JourViewController alloc] init];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />	UINavigationController *table2NavController = [[[UINavigationController alloc] initWithRootViewController:jourViewController] autorelease];<br />	table2NavController.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemHistory tag:2];<br />	table2NavController.navigationBar.tintColor = [UIColor blackColor];<br />	[jourViewController release];<br />
    


    Après dans mon JourViewController je récupère les infos dans le  -(void) viewDidLoad grâce au NSMutableArray que j'ai rempli.
  • muqaddarmuqaddar Administrateur
    23:08 modifié #7
    dans 1246443507:

    Après dans mon JourViewController je récupère les infos dans le  -(void) viewDidLoad grâce au NSMutableArray que j'ai rempli.


    Affiche dans un log le contenu de ce NSMutableArray dans viewDidLoad de ton controller, je pense qu'il n'est pas rafraà®chi après l'enregistrement d'un nouveau record.

    Je ne sais pas comment tu le charges ce MutableArray mais il ne doit pas être chargé après les insertions.

    Dans le viewDidLoad, essaie un truc du genre : [appDelegate readHistoriqueFromDatabase];

    Ensuite, n'oublie pas que les controllers ne sont pas forcément rechargés par les tabBarControllers. Il y a une méthode delegate de tabBarController qui peut s'en occuper.
  • CeetixCeetix Membre
    23:08 modifié #8
    Ca fait planter l'app si je mets ma méthode de lecture dans le viewDidLoad  :(
    J'ai mis un NSLog dans mon viewdidLoad quand je remplis mon tableau final. Mon premier clique sur le tabBar correspondant imprime bien tout. Ensuite je vais rajouter une valeur et quand je reclique sur mon tabBar rien ne s'affiche, le viewDidLoad n'est pas pris en compte.
  • muqaddarmuqaddar Administrateur
    23:08 modifié #9
    C'est normal que viewDidLoad ne soit pas rappelé.
    Tu peux recharger tes données avec la méthode delegate dont je t'ai parlée plus haut :

    - (void)tabBarController:(UITabBarController*)aTabBarController didSelectViewController:(UIViewController*)viewController<br />{<br />	// in order to reload the stars (note)<br />	NSArray *viewControllers = [tabBarController viewControllers];<br />	UIViewController *myViewController = [viewControllers objectAtIndex:1];<br />	<br />	if (viewController == myViewController)<br />	{<br />		[myViewController reloadAllData];<br />	}<br />}
    


    Il y a déjà  une discussion sur ce sujet dans le forum.
  • CeetixCeetix Membre
    23:08 modifié #10
    Bon donc je re-up ce post.
    J'ai bien fait tout ce que tu m'a indiqué muqaddar mais on dirait qu'il ne veut rien savoir sur la méthode reloadAllData...
  • Philippe49Philippe49 Membre
    23:08 modifié #11
    Bon peux-tu sans trahir de secret fournir la partie significative de ton code, notamment celle qui permet de voir les connections effectuées : qui est connu de qui ?
  • CeetixCeetix Membre
    23:08 modifié #12
    Oui bien sûr.
    Dans mon appDelegate .h j'ai

    <br />@class ListeViewController;<br />@class JourViewController;<br /><br /><br />@interface iOrygeenAppDelegate : NSObject &lt;UIApplicationDelegate,UITabBarControllerDelegate&gt;<br />UIWindow *window;<br />UITabBarController *tabBarController;<br />ListeViewController *listeViewController; // un premier tableView<br />JourViewController *jourViewController; // c&#39;est mon tableView qui doit se rafraichir<br /><br />// ...<br />
    


    dans le .m

    <br />- (void)applicationDidFinishLaunching:(UIApplication *)application {&nbsp; &nbsp; <br />		/* Je fais appel aux méthodes permettant de charger la BDD dans mes deux table view */<br />	[self initDatabase];<br />	[self checkAndCreateDatabase];<br />	<br />	[self readAlimentsFromDatabase];<br />	[self readHistoriqueFromDatabase];<br />	<br />	/* Mise en place du tabBarController */<br />	tabBarController = [[UITabBarController alloc] init]; <br />	[tabBarController setDelegate:self];<br />	listeViewController = [[ListeViewController alloc] init];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />	UINavigationController *tableNavController = [[[UINavigationController alloc] initWithRootViewController:listeViewController] autorelease];<br />	tableNavController.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:1];<br />	tableNavController.navigationBar.tintColor = [UIColor blackColor];<br />	[listeViewController release];<br />	<br />	jourViewController = [[JourViewController alloc] init];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />	UINavigationController *table2NavController = [[[UINavigationController alloc] initWithRootViewController:jourViewController] autorelease];<br />	table2NavController.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemHistory tag:2];<br />	table2NavController.navigationBar.tintColor = [UIColor blackColor];<br />	[jourViewController release];<br />	<br />	tabBarController.viewControllers = [NSArray arrayWithObjects:tableNavController, table2NavController, nil]; <br /><br />[window addSubview:tabBarController.view];<br />&nbsp;  [window makeKeyAndVisible];<br />}<br />
    




    Après dans mon JourViewController :

    .h
    <br />@interface JourViewController : UITableViewController {<br />	<br />	IBOutlet UITableView *jourTable;<br />	<br />	NSMutableArray *listeHist; // Tableau qui va récupérer ce que ma méthode de le lecture sql donne<br /><br />//...<br />
    



    .m
    <br />- (void)viewDidLoad {<br />&nbsp; &nbsp; [super viewDidLoad];<br />	iOrygeenAppDelegate *appDelegate = (iOrygeenAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	listeHist = [[NSMutableArray alloc] init];<br />	<br />	NSMutableArray *tab = [[NSMutableArray alloc] init];<br />	<br />	for(int i=0; i&lt;appDelegate.historique.count; i++) // Je regarde combien de valeurs mon tableau historique possède<br />	{<br />		Historique *unHistorique = (Historique *)[appDelegate.historique objectAtIndex:i];<br />		[tab addObject:unHistorique];<br />	}<br />	<br />	NSDictionary *aDic = [NSDictionary dictionaryWithObject:tab forKey:@&quot;jour&quot;];<br />	[listeHist addObject:aDic];<br />	<br />}<br />
    


    Voilà  je pense que j'ai à  peu près résumé la situation. S'il manque un truc dites le moi  :-\\
  • muqaddarmuqaddar Administrateur
    23:08 modifié #13
    Il faut délocaliser du code de viewDidController dans une méthode perso, tiens le reloadAlldata par exemple. ;)

    Ce paquet là  :

    iOrygeenAppDelegate *appDelegate = (iOrygeenAppDelegate *)[[UIApplication sharedApplication] delegate];<br />	listeHist = [[NSMutableArray alloc] init];<br />	<br />	NSMutableArray *tab = [[NSMutableArray alloc] init];<br />	<br />	for(int i=0; i&lt;appDelegate.historique.count; i++) // Je regarde combien de valeurs mon tableau historique possède<br />	{<br />		Historique *unHistorique = (Historique *)[appDelegate.historique objectAtIndex:i];<br />		[tab addObject:unHistorique];<br />	}<br />	<br />	NSDictionary *aDic = [NSDictionary dictionaryWithObject:tab forKey:@&quot;jour&quot;];<br />	[listeHist addObject:aDic];
    



    Tu appelles reloadAllData par le viewDidLoad la première fois qu'il est chargé et par le delegate du tabBarController dont je t'ai déjà  parlé les autres fois pour le refresh.

    Mais il faut aussi que l'accesseur historique recharge bien les données de ta table.
  • CeetixCeetix Membre
    23:08 modifié #14
    Ok là  je commence à  mieux comprendre.
    J'ai donc rempli mon reloadAllData avec une partie de ce que j'avais dans le viewDidLoad. J'appelle cette méthode dans mon viwDidLoad : [self reloadAllData];
    Ca marche.

    Après comment tu me l'as préciser avant je fais dans mon delegate :
    <br />if (viewController == myViewController)<br />	{<br />		[(JourViewController*)myViewController reloadAllData];<br />		<br />	}<br />
    


    Là  j'ai toujours le crash de mon app avec comme message :

    -[UINavigationController reloadAllData]: unrecognized selector sent to instance 0x121c10

    Pourtant reloadAllData est bien déclarer. J'ai essayé en mettant juste un NSLog dans mon reloadAllData et même là  ça plante, l'appel est mauvais on dirait. :(
  • CeetixCeetix Membre
    23:08 modifié #15
    J'ai fait comme ça :

    <br />	JourViewController*myViewController = [[JourViewController alloc]init];<br />		<br />		[myViewController reloadAllData];<br />		[myViewController release];<br />
    


    Est-ce que c'est pareil? En tout cas ça ne crash plus mais ca ne rafraichi pas non plus.
    C'est sans doute du dernier point donc tu parlais. Pourrais-tu m'expliquer plus en détail sur celui-ci ? 
  • muqaddarmuqaddar Administrateur
    23:08 modifié #16
    Non c'est pas bon.
    Tu crée une nouvelle instance, et tu ne prends pas celle qui est sélectionnée dans la tabBar.

    Montre le code complet de la méthode delegate de tabBarController de cet aprem, j'ai l'impression qu'il récupère pas la bonne instance du controller selectionné pour appeler reloadAllData.
  • AliGatorAliGator Membre, Modérateur
    23:08 modifié #17
    o_O
    Tu crées un conrôlleur, le rafraà®chit... et hop le détruit ?
    Moi j'achète rarement une voiture juste pour la nettoyer et la mettre à  la casse direct ensuite sans l'utiliser...
  • CeetixCeetix Membre
    23:08 modifié #18
    Oui tu as raison Ali... ça ce sera quand j'aurai pleins de blé, et encore ... :)
    Celle de cette aprem?

    J'avais mis ça :
    [tabBarController setDelegate:self]
    


    et ça

    <br />- (void)tabBarController:(UITabBarController*)aTabBarController didSelectViewController:(UIViewController*)viewController<br />{<br />	NSArray *viewControllers = [tabBarController viewControllers];<br />	UIViewController *myViewController = [viewControllers objectAtIndex:1];<br />	<br />	if (viewController == myViewController)<br />	{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [(JourViewController*)myViewController reloadAllData];<br />	}<br />}<br />
    
  • muqaddarmuqaddar Administrateur
    juillet 2009 modifié #19
    Ah, tiens, dans mon cas, moi c'était l'onglet numéro 1 !
    Mais toi, c'est le numéro 1, le 0 ou autre ??

    [viewControllers objectAtIndex:1];
    


    Du coup, tu appelles une méthode sur le mauvais controller... et paf le chat.  :(renaud):
  • CeetixCeetix Membre
    23:08 modifié #20
    Bah le truc c'est que je pense que c'est bien 1 car c'est mon deuxième bouton sur mon tabBar et j'en ai que deux :s
  • muqaddarmuqaddar Administrateur
    23:08 modifié #21
    Dans ton tabBar en question, tu as un navigation controller, et non un viewController directement, c'est ça ?
  • CeetixCeetix Membre
    juillet 2009 modifié #22
    Oui je crois

    edit : oui c'est ça (j'étais pas sur mon mac)
  • AliGatorAliGator Membre, Modérateur
    23:08 modifié #23
    Tous les crash des applications sont dûs à  paf le chat, je l'ai toujours dit.
  • CeetixCeetix Membre
    23:08 modifié #24
    Par contre je pense que c'est bien ça car quand je mets un NSLog() dans ma condition if (viewController == myViewController) et que je clique sur min tabBar il y a bien la trace à  la console.
  • muqaddarmuqaddar Administrateur
    23:08 modifié #25
    dans 1246566576:

    Oui je crois


    Tu crois ? lol

    Bon, alors il faut ajouter une étape supplémentaire.
    Comment veux-tu qu'il sache quel controller rafraichir si ce controller est le premier du navigation controller, et non directement un view controller ?

    Dans la même méthode du delegate, il faut récupérer le premier controller de ton navigation controller que tu as créé (le root controller).
  • CeetixCeetix Membre
    23:08 modifié #26
    Donc mon post sur ma condition qui est vérifiée et la trace qui s'affiche bien n'a rien à  voir avec ça ?
  • muqaddarmuqaddar Administrateur
    23:08 modifié #27
    dans 1246567457:

    Donc mon post sur ma condition qui est vérifiée et la trace qui s'affiche bien n'a rien à  voir avec ça ?


    Mais un marqueur ou plusieurs et direction le debugger, y'a pas 36 solutions.
    Mets aussi des marqueurs dans reloadAllData.

    Comme ça, tu verras si c'est le bon contrôleur qui est appelé, et si ça plante, je pense que c'est parqu'il est releasé.
  • CeetixCeetix Membre
    juillet 2009 modifié #28
    J'ai remis ce code :
    <br />- (void)tabBarController:(UITabBarController*)aTabBarController didSelectViewController:(UIViewController*)viewController<br />{<br />	NSArray *viewControllers = [tabBarController viewControllers];<br />	UIViewController *myViewController = [viewControllers objectAtIndex:1];<br />	<br />	if (viewController == myViewController)<br />	{<br />		NSLog(@&quot;ok&quot;);<br />		//[(JourViewController*)myViewController reloadAllData];<br />	}<br />}<br />
    


    J'ai fait un NSLog pour voir si c'était bien le bon. Voici une petite vidéo

    C'est donc bien le bon que je sélectionne , non?
    Quand je décommente ma ligne c'est fini ça crash. Je suis dépité je vois pas pourquoi là .
  • Philippe49Philippe49 Membre
    23:08 modifié #29
    Essaye
    if([myViewController respondsToSelector:@selector(reloadAllData)]) {
    NSLog(@responds);
    }
  • CeetixCeetix Membre
    23:08 modifié #30
    Hum en effet, rien n'est affiché ...
  • Philippe49Philippe49 Membre
    23:08 modifié #31
    Maintenant essaie
    NSLog((@%@",[myViewController class]);
Connectez-vous ou Inscrivez-vous pour répondre.