Charger contenu .plist dans UITableView

KassKass Membre
00:56 modifié dans API UIKit #1
Salut à  tous !

je suis entrain de créer en ce moment ma première application pour iPhone.
Jusque là  ça avance pas trop trop mal, mais depuis deux jours j'avance pas. J'ai créé une view avec dedans un UITableView, et je voudrais charger le contenu d'un fichier plist.

Voici la structure de mon plist:

<br />- Root (Dictionnary)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - A (Dictionnary)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - B (Dictionnary)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - C (Dictionnary)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - F (Dictionnary)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - France (Array)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Paris (String)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Lyon (String)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Marseille (String)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 000 (Number)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - G (Dictionnary)<br /><br />.<br />.<br />.<br />.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />


Je dispose donc de ditionnaire pour chacune des lettres, car l'affichage sera dans un TableView Indexed. J'ai jusque là  suivi un tuto, mais la conception de mon plist est différentes, et j'arrive pas a changer le code pour que cela marche.

Voici le code de mon viewload d'origine (celui réalisé avec le tuto). (Dans le plist du tuto, il y avait un Array pour chacune des lettres, et dans chaque array, des Strings avec des prénoms).

<br /><br />	NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;villes&quot; ofType:@&quot;plist&quot;];<br />	NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br />	self.names = dict;<br />	<br />	NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; self.keys = array;<br /><br />&nbsp; &nbsp; &nbsp;  [dict release];<br />&nbsp; &nbsp; &nbsp;  [array release];<br />&nbsp; &nbsp; &nbsp;  [path release];<br /><br />


Dans mon Table view je voudrais charger pour chacune des lettres les noms des pays puis lorsque l'on selectionne un des ces pays, une nouvelle vue s'ouvre. Pour cette vu j'ai besoin d'avoir l'Array du pays sélectionné, afin d'afficher les informations des différentes villes.

Si quelqu'un pourrait me donner un petit coup de main, ça serait vraiment gentil. Je cherche de partout et pour l'instnant j'arrive pas trop a maitriser ce chapitre.

Merci à  vous!

Réponses

  • laurrislaurris Membre
    00:56 modifié #2
    De rien mais qu'est qui ne marche pas exactement.
    - L'affichage des pays dans une tableview indexed selon le code ci-dessus.
    ou bien
    - L'affichage (ou la selection) de la vue pour chaque pays.

    Si on savait aussi ce qui marche, par élimination on pourrait aider.
  • KassKass Membre
    00:56 modifié #3
    En fait c'est l'affichage des pays dans un Table View. Je copie l'enssemble de ma classe, afin que vous compreniez mieux mon problème.
    Ce code je l'ai trouvé dans le livre: "Beginning iPhone Development" de Dave Mark & Jeff LaMarche.
    Il est adapté a plist de type:

    - Root (Dictionnary)
            - A (Array)
                    nom (String)

    Il affiche des noms classé par ordre alphabétique, une section par lettre.

    Je n'arrive malheureusement pas trop à  maitriser tout ça pour le moment :(


    <br /><br />#import &quot;MapsViewController.h&quot;<br /><br />@implementation MapsViewController<br />@synthesize table;<br />@synthesize names;<br />@synthesize keys;<br />@synthesize allNames;<br />@synthesize navBar;<br /><br /><br />#pragma mark -<br />#pragma mark UIViewController Methods<br /><br />- (void)viewDidLoad {<br />	<br />	NSString *path = [[NSBundle mainBundle] pathForResource:@&quot;villes&quot; ofType:@&quot;plist&quot;];<br />	NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];<br />	self.names = dict;<br />	<br />	[dict release];<br /><br />	NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];<br />	self.keys = array;<br />	 <br />	<br />}<br /><br /><br />- (IBAction)backToChoose:(id)sender {<br />	<br />	[self.view setHidden:YES];<br />}<br /><br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />	// Return YES for supported orientations<br />	return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br /><br /><br />- (void)didReceiveMemoryWarning {;<br />	[super didReceiveMemoryWarning]; // Releases the view if it doesn&#39;t have a superview<br />	// Release anything that&#39;s not essential, such as cached data<br />}<br /><br /><br />- (void)dealloc {<br />	[table release];<br />	[allNames release];<br />	[keys release];<br />	[names release];<br />	[navBar release];<br />	[super dealloc];<br />	<br />}<br /><br /><br />#pragma mark -<br />#pragma mark Table View Data Source Methods<br /><br />- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView<br />{<br />	return [keys count];<br />}<br /><br /><br />- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section<br />{<br />	<br />	NSString *key = [keys objectAtIndex:section];<br />	NSArray *nameSection = [names objectForKey:key];<br />	return [nameSection count];<br />}<br /><br /><br />- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath<br />{<br />	NSInteger section = [indexPath section];<br />	NSInteger row = [indexPath row];<br />	<br />	NSString *key = [keys objectAtIndex:section];	<br />	NSArray *nameSection = [names objectForKey:key];<br />	<br />	static NSString *sectionsTableIdentifier = @&quot; sectionsTableIdentifier &quot;;<br />	<br />	UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier: sectionsTableIdentifier];<br />	if (cell == nil) {<br />		cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero <br />									&nbsp;  reuseIdentifier: sectionsTableIdentifier] autorelease];<br />	}<br />	<br />	cell.text = [nameSection objectAtIndex:row];<br />	return cell;<br />	<br />}<br /><br /><br />- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section<br />{<br />	<br />	<br />	NSString *key = [keys objectAtIndex:section];<br />	return key;<br />}<br /><br /><br />- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView<br />{<br />	<br />	return keys;<br />}<br /><br /><br />@end<br /><br />
    



    Donc si tu maitrises bien les TableView, ça serait vraiment sympas de ta part si tu pouvais m'éclairer.
    Je sais d'où vient le problème, ça vient entre autre du fait que les noms des pays sont des Dictionnaires et non des String. Mais je ne vois pas trop comment continuer :(
  • Philippe49Philippe49 Membre
    février 2009 modifié #4
    Bon d'abord la structure de ta plist est mal choisie. Il vaudrait mieux faire

    root
      -A (array)
         ....
      -F (array)
            -Finlande (array)
                ...;     
            -France (array)
                 -Paris (dictionary)
                      -key=region            value=Ile de france (string)
                      -key=population      value= 2 181 371 (number)
                      -key=..
                -Marseille (dictionary)
                      -key=region            value=Provence , Côte d'Azur (string)
                      -key=population      value= 2 181 371 (number)
                      -key=..


    Maintenant pour représenter cette arborescence, une seule table view ne peut suffire.
    Il faut une table view (et donc un UITableViewController) pour les initiales A ... F, puis une seconde table view pour présenter les pays correspondant à  une initiale, et enfin un troisième niveau pour présenter les villes.

    Donc premièrement, mettre en place la table view pour installer les initiales :


  • Philippe49Philippe49 Membre
    00:56 modifié #5
    Ou alors

    root
      -A (array)
        ....
      -F (array)
            -Finlande (array)
                ...;   
            -France (array)
                -1 (dictionary)
                      -key=ville              value=Paris (string)
                      -key=region            value=Ile de france (string)
                      -key=population      value= 2 181 371 (number)
                      -key=..
                -2 (dictionary)
                      -key=ville              value=Marseille (string)
                      -key=region            value=Provence , Côte d'Azur (string)
                      -key=population      value= 2 181 371 (number)
                      -key=..


    Cela ne modifie pas le nombre de niveaux.

  • AliGatorAliGator Membre, Modérateur
    00:56 modifié #6
    On peut se contenter de 2 UITableView, en utilisant une TableView avec des sections (et donc en prenant aussi en considération indexPath.section en plus de indexPath.row) pour grouper les pays par ordre alphabétique. Comme dans l'appli Contacts de l'iPhone où les noms des personne sont groupées par section selon l'initiale du nom. Y'a même moyen de mettre une petite "réglette" avec les initiales à  droite de la TableView pour pouvoir aller directement à  une section donnée d'un clic... comme dans l'appli Contacts aussi donc.

    Mais bon il faut quand même plus d'une tableView de toute façon évidemment, une pour la liste des pays (groupés suivant l'initiale donc), et une autre pour que quand on clique sur un pays ça affiche les villes dudit pays...
  • KassKass Membre
    00:56 modifié #7
    D'abord merci pour vos réponses.
    Il y a deux choses. Pour l'arborescence du plist, si F est un array, alors l'array France devra s'appeller item. C'est pour ça que je voulais utiliser des NSDictionnary pour les lettres.

    Ensuite oui ce que je veux ce sont 2 vues. la première affiche les Pays trié par ordre alphabétique, découpés en sections pour chacune des lettres. Et exactement comme pour l'app Contact, avec la petite réglette avec les lettres. Pour ça tout est là , quand je test avec le plist du tuto, ça marche parfaitement.
    Maintenant ce que je voudrais, c'est extraire correctement les infos de mon plist.

    Ensuite la seconde vue, ça ça sera facile a réaliser, une nouvelle vue va se créer, et j'aurais juste a disposer en donnés, l'array du pays sélectionné.

    Les TableView sont je trouve assez compliqués. J'espère pouvoir réussir celà  un de ces jours, car tout le reste avance assez vite.
  • Philippe49Philippe49 Membre
    00:56 modifié #8
    dans 1235183271:

    Ensuite oui ce que je veux ce sont 2 vues. la première affiche les Pays trié par ordre alphabétique, découpés en sections pour chacune des lettres. Et exactement comme pour l'app Contact, avec la petite réglette avec les lettres. Pour ça tout est là , quand je test avec le plist du tuto, ça marche parfaitement.


    Quitte le tuto des yeux !

    <br /><br />- (void)viewDidLoad {<br />	[super viewDidLoad];<br />	NSString * path=[[NSBundle mainBundle] pathForResource:@&quot;Cities&quot; ofType:@&quot;plist&quot;];<br />	cities=[[NSArray alloc] initWithContentsOfFile:path];<br />	// les titres<br />	sectionTitles=[[NSMutableArray alloc] init];<br />	for(NSDictionary * item in cities) {<br />		[sectionTitles addObject:[item valueForKey:@&quot;Initial&quot;]];<br />	}<br />	NSLog(@&quot;%@&quot;,sectionTitles);<br />}<br /><br /><br /><br /><br />#pragma mark Table view methods<br /><br />- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {<br />	return [cities count];<br />}<br /><br /><br />// Customize the number of rows in the table view.<br />- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {<br />	NSDictionary * item=[cities objectAtIndex:section];<br />	NSArray * states=[item valueForKey:@&quot;States&quot;];&nbsp;  <br />	return [states count];<br />}<br /><br /><br />// Customize the appearance of table view cells.<br />- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {<br />	<br />	static NSString *CellIdentifier = @&quot;Cell&quot;;<br />	<br />	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br />	if (cell == nil) {<br />		cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];<br />	}<br />	NSDictionary * item=[cities objectAtIndex:indexPath.section];<br />	NSArray * states=[item valueForKey:@&quot;States&quot;];&nbsp;  <br />	NSDictionary * state=[states objectAtIndex:indexPath.row];<br />	cell.text=[state valueForKey:@&quot;State&quot;];<br />	<br />	return cell;<br />	}<br />	<br />- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {	<br />	return sectionTitles;<br />}<br />- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {<br />	return [sectionTitles objectAtIndex:section];<br />}<br />
    




    et la plist
  • Philippe49Philippe49 Membre
    00:56 modifié #9
    dans 1235183271:

    Les TableView sont je trouve assez compliqués. J'espère pouvoir réussir celà  un de ces jours, car tout le reste avance assez vite.

    C'est parce que là  ce n'est une simple table view que tu gères (une NSArray), c'est une arborescence. Donc tu n'es pas dans le modèle NSTableView de Cocoa, mais le modèle NSOutineView/NSBrowser
  • KassKass Membre
    00:56 modifié #10
    Merci beaucoup pour ton énorme travail !!
    Je dois malheureusement m'absenter aujourd'hui, donc je pourrais tester que ce soir, et je te donnerais des nouvelles !

    Encore merci pour cette aide très précieuse :)
  • KassKass Membre
    00:56 modifié #11
    ça y est, j'ai pu tester ton travail.

    Et ça marche parfaitement ! Merci énormément d'avoir consacré autant d'efforts afin de m'aider :)
Connectez-vous ou Inscrivez-vous pour répondre.