Comment recharger tableView à  chaque affichage ?

iPatxiPatx Membre
00:19 modifié dans API UIKit #1
Bonjour,

J'ai un petit souci avec mon application. A partir du premier onglet de ma tabBar, je peux ajouter des données dans un fichier.

Le deuxième onglet permet l'affichage des données.

Mon souci est que l'affichage du second onglet est chargé une seule fois (au premier chic sur l'onglet 2). Donc si je reviens au premier onglet, que j'ajoute des infos, elles ne seront pas affichées sauf si je relance l'application.

Est-il possible de lancer une fonction à  chaque affichage de l'onglet?

Merci
iPatx
«1

Réponses

  • muqaddarmuqaddar Administrateur
    00:19 modifié #2
    Un petit [tableView reloadData] dans la méthode viewWillAppear devrait régler le problème.
  • iPatxiPatx Membre
    00:19 modifié #3
    La méthode viewWillAppear n'est pas appelée : mon NSLog que j'y ai fait ne s'affiche pas :S
  • muqaddarmuqaddar Administrateur
    00:19 modifié #4
    dans 1245079399:

    La méthode viewWillAppear n'est pas appelée : mon NSLog que j'y ai fait ne s'affiche pas :S


    Regarde la doc... il manque certainement le booléen à  la fin. ;)

    http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewWillAppear:
  • iPatxiPatx Membre
    00:19 modifié #5
    J'avais bien le booléen.

    En fait j'ai un ViewController qui ensuite charge le TableViewcontroller.

    Je viens de voir que la méthode viewWillAppear du ViewController est appelée à  chaque fois et celle du TableViewController jamais (ce qui correspond aux infos de la doc Apple).

    Donc je fouille de se côté la.

    Merci de ton aide
  • muqaddarmuqaddar Administrateur
    00:19 modifié #6
    Dans la méthode delegate du tabBarController, tu peux faire ça :

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


    reloadDataOfTableView étant une méthode du controller qui recharge la table.

    Cela fonctionne.
  • iPatxiPatx Membre
    00:19 modifié #7
    Petit souci, la tabBar appelle un ViewController (qui ajoute la navigationBar) qui lui appelle le TableViewController.

    donc reloadDataOfTableView essaye de s'appliquer sur le ViewController et pas le TableViewController :S
  • muqaddarmuqaddar Administrateur
    00:19 modifié #8
    Bein, tu peux faire une étape en plus.

    La méthode de reloaddata ds le view controller trouve la vue du navigationController en cours (avec self.navigationController selectedController ou un truc du genre je n'ai plus le nom en tête), et tu lui renvoies à  elle un tableView reloadData.
  • iPatxiPatx Membre
    00:19 modifié #9
    Merci beaucoup!!!

    J'ai enfin réussi en ajoutant
    [[self.navigationController visibleViewController] rechargement]
    
    dans le viewWillAppear de mon ViewController et en ajoutant la méthode rechargement (qui effectue la mise a jour des données et de la tableView) dans mon TableViewController.

    :)
  • CeetixCeetix Membre
    00:19 modifié #10
    Bon j'ai regardé ce post qui est exactement le problème que j'ai.
    Déjà  j'ai mis le viewDidAppear et bon signe quand je fais une trace il me l'affiche bien quand je selectionne le tableView via mon tabBar.

    J'ai mis la méthode
    <br />- (void)tabBarController:(UITabBarController*)aTabBarController didSelectViewController:(UIViewController*)viewController;<br />
    

    dans mon delegate mais j'ai un warning : "UIViewController may not respond to -reloadDataOfAllTableView "

    et sur le dernier message de iPatx je comprends pas trop pourquoi il met ça et que peut-être ça méthode rechargement :(
  • muqaddarmuqaddar Administrateur
    00:19 modifié #11
    C'est normal, reloadDataOfAllTableView était une méthode perso à  moi !
    Cette méthode faisait un reloadData sur la tableView de la classe.
  • CeetixCeetix Membre
    00:19 modifié #12
    Arf ok oui en effet, j'ai même pas été voir dans la doc que ça n'existait pas ... -_-
    Mais la méthode tabBarController n'est pas appelé car je n'ai pas la trace sur la console.
  • Philippe49Philippe49 Membre
    00:19 modifié #13
    dans 1246520503:

    Arf ok oui en effet, j'ai même pas été voir dans la doc que ça n'existait pas ... -_-

    Manque de réflexe !!
  • CeetixCeetix Membre
    00:19 modifié #14
    Oui roo ça vient doucement mais sûrement :D .
    Par contre je comprends pas pourquoi je ne rentre pas dans la méthode du tabBar.
  • Philippe49Philippe49 Membre
    00:19 modifié #15
    dans 1246524015:

    Par contre je comprends pas pourquoi je ne rentre pas dans la méthode du tabBar.

    Je n'ai pas suivi la discussion, je ne peux te dire que des banalités :
    - Le delegate est-il bien désigné ? 
    - Il n'y aurait pas multiplication des instances (une dans le xib et une dans le code par exemple) et que cette connexion ne soit pas sur la bonne instance ?
  • CeetixCeetix Membre
    00:19 modifié #16
    Alors le tabBar n'est pas créé via IB . J'ai
    <br />tabBarController = [[UITabBarController alloc] init]; <br />	<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 />
    


    Par contre je vois pas trop comment savoir si le delegate est bien désigné ...
  • Philippe49Philippe49 Membre
    00:19 modifié #17
    La doc sur UITabBarController ne donnerait-elle pas des méthodes à  ce sujet ?

    dans 1246523769:

    dans 1246520503:

    Arf ok oui en effet, j'ai même pas été voir dans la doc que ça n'existait pas ... -_-

    Manque de réflexe !!

    huum ?  :)
  • CeetixCeetix Membre
    00:19 modifié #18
    dans 1246524015:

    Oui roo ça vient doucement mais sûrement :D .


    Tu as oublié de cité ça :)
    J'ai regarder dans la doc, j'ai l'impression que ça se passe du côté de @interface.
    Moi j'ai ça :

    <br />@interface pierreAbAppDelegate : NSObject &lt;UIApplicationDelegate&gt;<br />
    
  • muqaddarmuqaddar Administrateur
    00:19 modifié #19
    Moi je pense que tu a oublié ça :

    [tabBarController setDelegate:self]
    

  • CeetixCeetix Membre
    00:19 modifié #20
    en effet ... et pour que ça marche j'ai rajouté :
    <br />@interface iOrygeenAppDelegate : NSObject &lt;UIApplicationDelegate,UITabBarControllerDelegate&gt; <br />
    


    J'ai bon sur ce point ? ^^
  • CeetixCeetix Membre
    00:19 modifié #21
    J'ai essayer d'implémenter ta méthode de rechargement  muqaddar en par exemple re-lisant ma BDD mais ça fait tout planter. :s
  • muqaddarmuqaddar Administrateur
    00:19 modifié #22
    dans 1246541169:

    J'ai essayer d'implémenter ta méthode de rechargement  muqaddar en par exemple re-lisant ma BDD mais ça fait tout planter. :s


    Je ne peux pas t'aider sans code.
    Dans ton cas, il s'agit de recharger la vue associée à  un tabBar. Cette vue ne recharge qu'une partie des données et non toute la base pour commencer.

    Ce n'est pas Ma méthode mais une méthode delegate de tabBarController qui s'en charge.
  • CeetixCeetix Membre
    00:19 modifié #23
    Hum eu niveau code je vois pas trop quoi te donner pour t'aider je suis un peu beaucoup paumé sur ce problème ...
  • muqaddarmuqaddar Administrateur
    00:19 modifié #24
    dans 1246541169:

    J'ai essayer d'implémenter ta méthode de rechargement  muqaddar en par exemple re-lisant ma BDD mais ça fait tout planter. :s


    Bein par exemple, pour commencer, ça plante où ?
  • CeetixCeetix Membre
    00:19 modifié #25
    Le pire c'est que j'ai beau essayer de tracer où ça foire bah j'y arrive pas. Mais en tout cas je sais que c'est quand je ré appelle ma fonction lecture de BDD. Comme tu m'as dit que c'était pas ça qu'il fallait rafraichir j'ai enlevé et là  ça marche mais ça fait rien . De plus j'ai l'impression que iPatx à  rempli son viewWillAppear non?
  • muqaddarmuqaddar Administrateur
    00:19 modifié #26
    Dans mon application, j'ai ce code dans mon la classe qui contrôle mon tabBarController :

    # pragma mark tabBarController delegate methods<br /><br />- (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 />		[(ShowDessertSummaryViewController*)myViewController reloadAllData];<br />	}<br />}
    


    Et dans le ShowDessertSummaryViewController, la fameuse méthode perso reloadAllData fait ceci :

    - (void)reloadAllData {<br />	[self.tableView reloadData];	<br />}
    


    Donc, quand je reviens sur l'onglet correspondant à  ShowDessertSummaryViewController, il recharge les données datasource naturellement.

    Après, mon datasource doit être bien différent du tien.
    Le mien est géré par une classe "parente" dans un protocole dont se servent chaque contrôleur de chaque onglet du tabBar.

    @protocol DessertDataSource<br />- (Dessert*)dessertWithInclusions;<br />@end
    


    Du coup, IB voit même le datasource dessertDataSource à  lire/alimenter avec la tableView.
  • CeetixCeetix Membre
    00:19 modifié #27
    Merci pour cet exemple !
    Bon j'ai essayé d'implémenter ça mais ça plante :s avec ce message :

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UINavigationController reloadAllData]: unrecognized selector sent to instance 0x121ad0'
  • muqaddarmuqaddar Administrateur
    00:19 modifié #28
    dans 1246549128:

    Merci pour cet exemple !
    Bon j'ai essayé d'implémenter ça mais ça plante :s avec ce message :

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UINavigationController reloadAllData]: unrecognized selector sent to instance 0x121ad0'


    Bein t'as pas dû déclaré ta méthode reloadAllData.
  • CeetixCeetix Membre
    00:19 modifié #29
    Bah si quand même ^^ .
  • CeetixCeetix Membre
    00:19 modifié #30
    Bon j'ai vérifié et j'ai bien défini reloadAllData .

    J'ai :


    <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 />		[(JourViewController*)myViewController reloadAllData];<br />		<br />	}<br />}<br />
    



    puis dans mon JourViewController

    .h
    <br />- (void)reloadAllData;<br />
    


    .m
    <br />- (void)reloadAllData {<br />	NSLog(@&quot;ok&quot;);<br />	[self.tableView reloadData];&nbsp;  <br />}<br />
    


    Donc oui tu as raison sur le fait que c'est comme si il ne reconnaissait pas la méthode car même le "ok" n'est pas imprimé. Par contre tout est bien déclaré et le compilateur ne m'indique rien à  l'encontre de ça .
  • Philippe49Philippe49 Membre
    00:19 modifié #31
    Bon le post commence à  s'allonger, et on ne sait plus trop où on en est.

    Ne peux-tu pas reformuler dans un post les données et ta question , de la façon la plus précise possible, Merci ?
Cette discussion a été fermée.