Remplissage dynamique d'un UITableView

radarradar Membre
11:40 modifié dans API UIKit #1
Salut,

je profite de ce premier message après avoir pas mal parcouru ce forum depuis quelques semaines pour dire quelques mots. Alors, avant toute chose, j'aimerais remercier les personnes qui en sont à  l'origine et celles qui participent à  son (bon) fonctionnement.

Me concernant, je fais de la programmation depuis quelques années. J'ai commencé à  la fac et poursuivi lors de mes différents emplois. Je connais essentiellement C et ai fait très peu de programmation objet. En fait, le C suffisait à  la plupart des projets auxquels j'ai pariticipé. Je connais aussi pas mal les langages de script. En somme, je me considère comme étant un développeur moyen.

Concernant le développement en objective-c, je suis en train d'apprendre un peu sur le tas. En fait, j'ai voulu commencer par le livre de programmation Cocoa sous Mac OSx de Aaron Hillegass, mais comme je n'ai pas le temps de faire les exemples (je lis mon livre dans les transports essentiellement), je n'avance pas beaucoup. Du coup, j'essaie d'aller directement à  ce que je veux faire.

J'en arrive maintenant à  ma requête :)
J'ai besoin de remplir un UITableView en fonction du choix effectué dans un précédent UITableView. Le problème, c'est que je ne sais pas comment passer un objet d'une vue à  une autre. Dans mon cas, il faudrait que la seconde vue puisse récupérer le contenu de l'objet sélectionné dans le premier UITableView.

Si quelqu'un peut me dire comment je peux faire ça, je lui serais très reconnaissant.

Merci d'avance.

Réponses

  • AliGatorAliGator Membre, Modérateur
    11:40 modifié #2
    Au moment où tu cliques dans une cellule de ta première UITableView (et que ton delegate reçoit "tableView: didSelectRowAtIndexPath:" ou une méthode du genre cf la doc du UITableViewDelegate), l'idée est de créer un UITableViewController, ou plutôt une sous-classe de UITableViewController, de la configurer, et ensuite de lui dire de s'afficher typiquement en la "poussant" sur le NavigationController (pushViewController:animated:, de mémoire).

    Donc ton 2e UITableViewController qui va afficher la UITableView affichant ton "sous-contenu", tu vas la créer par code... et à  ce moment là  tu peux du coup la configurer en particulier lui passer des informations sur l'index sur lequel tu as cliqué dans ta première UITableView, avant de pousser cette 2e UITableView.
    ...tableView:...didSelectRowAtIndexPath:(NSIndexPath*)path<br />{<br />&nbsp; MyTableViewController* tvc = [[MyTableViewController alloc] init...]; // ou initWithNibName:... bundle:..., selon le besoin<br />&nbsp; tvc.cheminCourant = path;<br />&nbsp; ...<br />&nbsp; [self.navigationController pushViewController:tvc animated:YES];<br />&nbsp; [tvc release];<br />}
    
    où dans mon exemple cheminCourant est une variable d'instance de ta classe MyTableViewController, qui elle n'est rien d'autre qu'une classe héritant de UITableViewController.

    Du coup dans ta 2e table (celle des "sous-données") affichée par la MyTableViewController, tu as ainsi dans une variable accès au indexPath sélectionné à  l'étape d'avant, ce qui te permet de remplit cette table avec les données adéquates ensuite.

    Bon tu peux utiliser une autre type de variable d'instance, tu peux passer un peu tout ce que tu veux selon tes besoins et ce que tu déclares dans ton MyTableViewController.h mais tu vois l'idée.
  • radarradar Membre
    11:40 modifié #3
    Merci Aligator.

    Pour faire un test, j'ai rajouté un champ dans l'implémentation de secondViewController que j'ai appelé name de type NSString.
    Donc, dans le didSelect... de mon firstViewController, j'ai fait :


    if (self.secondView == nil) {<br />		SecondViewController *viewController = [[SecondViewController alloc] initWithNibName:@&quot;SecondViewController&quot; bundle:[NSBundle mainBundle]];<br />		self.secondView = viewController;<br />		[viewController release];<br />	}<br />	[self.navigationController pushViewController:self.secondView animated:YES];<br />	self.secondView.name = [personne name];<br />	self.secondView.title = [personne name];<br />	[groupe release];
    


    En fait, pour tester, je veux juste remplir toutes les cellules du même nom sélectionné dans le premier UITableView.
    Donc, dans le second, j'ai mis

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; static NSString *CellIdentifier = @&quot;Cell&quot;;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br />&nbsp; &nbsp; if (cell == nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Set up the cell...<br />	[cell setText:self.name];<br />&nbsp; &nbsp; return cell;<br />}
    


    Et ça marche... que la première fois. Après, c'est toujours la même valeur qui est renvoyée. Est-ce en rapport avec le "@property"; que j'ai déclaré en (nonatomic, retain) ?

    Merci encore.
  • radarradar Membre
    11:40 modifié #4
    J'ai bien essayé de régler le problème par moi-même, mais après maintes essais, je suis obligé de repasser par là .

    Donc, j'en suis toujours à  ma RootView qui affiche un tableau avec des données issues d'une base de données. Jusque là , pas de problème. Le tableau m'affiche 5 cellules (lignes) contenant les chiffres allant de 1 à  5.

    J'ai fait en sorte à  ce que le clic sur chaque cellule du tableau affiche une nouvelle vue dotée d'un UITableView de 4 lignes (taille statique), chacune affichant la valeur sélectionnée dans le tableau précédent (au cas où j'ai du mal à  être clair, cliquer sur 3 dans le premier tableau affiche 4 cellules contenant chacune 3 dans le second). J'ai fait en sorte également à  ce que le titre de la vue porte la même valeur (3 dans mon exemple).

    Quand je clique une première fois sur une cellule du premier tableau, disons la 3, tout fonctionne parfaitement. Ensuite, deux problèmes se posent à  moi :

    1 - Un autre clic, sur toute autre cellule, disons la 2, affiche bien le 2 en titre de la vue, mais 3 dans les cellules. Un retour en arrière et un clic sur une autre cellule, disons la 4, produit le même comportement (avec un 4 en titre de vue et des 3 dans les cellules).

    2 - Tout clic sur une cellule déjà  cliquée (disons 3, 2 ou 4) fait planter l'application avec le message d'erreur suivant :

    *** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** -[CALayerArray name]: unrecognized selector sent to instance 0x529430&#39;
    


    Ce qui m'embête un peu, c'est que l'application sur laquelle je suis ressemble fortement à  une autre qui ne se comporte pas du tout de la sorte.
    Si quelqu'un a une idée, je suis preneur.

    Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.