2009-12-22 4 views
1

J'ai un plist avec une liste alphabétique des entrées. Je veux maintenant ajouter un niveau supplémentaire pour que chaque entrée ait un texte de définition (comme un petit dictionnaire.) J'ai besoin de quelques conseils sur la façon de modifier mon plist et le code pour accommoder cela. Le code existant est ci-dessous - il provient du livre d'Apress, mais je n'arrive pas à le modifier pour un autre niveau.Comment modifier iPhone plist pour ajouter un autre niveau et accéder aux données dans le code

NSString *path = [[NSBundle mainBundle] pathForResource:@"sortedglossary" ofType:@"plist"]; 
NSDictionary *dict = [[NSDictionary alloc]initWithContentsOfFile:path]; 
self.names = dict; 
[dict release]; 

NSArray *array = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)]; 
self.keys = array; 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
NSLog(@"numberOfSectionInTable start"); 
return [keys count]; 
} 


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
NSLog(@"numberOfRowsInSection start"); 
NSString *key = [keys objectAtIndex:section]; 
NSArray *nameSection = [names objectForKey:key]; 
return [nameSection count]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
NSUInteger section = [indexPath section]; 
NSUInteger row = [indexPath row]; 
NSString *key = [keys objectAtIndex:section]; 
NSArray *nameSection = [names objectForKey:key]; 
static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SectionsTableIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SectionsTableIdentifier] autorelease]; 
} 

cell.text = [nameSection objectAtIndex:row]; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
return cell; 
} 

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
NSLog(@"titleForHeader"); 
NSString *key = [keys objectAtIndex:section]; 
return key; 
} 

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
return keys; 
} 

Répondre

0

Il y a plusieurs façons d'y parvenir. Normalement, je vais juste créer un autre enfant du nœud racine dans le plist pour les définitions.

Ainsi votre plist aurait le tableau de vos entrées et il aurait un autre dictionnaire. Le dictionnaire contient le texte de définition, saisi par les valeurs du premier tableau. De cette façon, vous pouvez simplement consulter la définition lorsque vous en avez besoin.

Ainsi, la structure ressemblerait à peu près comme ceci:

Root 
    Entries(NSArray) 
    0 => entryA(NSString) 
    1 => entryB(NSString) 
    ... 
    x => entryX(NSString) 
    Definitions(NSDictionary) 
    entryA(NSString) => definitionA(NSString) 
    entryB(NSString) => definitionB(NSString) 
    ... 
    entryX(NSString) => definitionX(NSString) 
+0

Merci pour cela. Il y aura plusieurs entrées pour chaque lettre de l'alphabet (comme un mini-dictionnaire). Donc, cela ressemblera-t-il à: Racine ?? A (Array) => Elément 0 (Dictionnaire) => AFirstWord (Array) => AFirstdefinition (String), Elément 1 (Dictionnaire) => ASecondWord (Array) => ASeconddefinition (String) B (Array) => Elément 0 (Dictionnaire) => BFirstWord (Array) => BFirstdefinition (String), Rubrique 1 (Dictionnaire) => BSecondWord (Array) => BSeconddefinition (String) –

+0

Eh bien, il n'y a pas vraiment de "bon" ou de "mauvais" moyen pour le faire. Tout dépend des besoins de votre programme. Il semble que vos besoins aient des entrées et des définitions ordonnées pour ces entrées. Avoir plus d'une entrée par lettre de l'alphabet ne devrait pas être un problème avec la méthode que j'ai décrite. La solution que vous proposez fonctionnerait probablement, mais elle semble assez complexe, et les tableaux/dictionnaires d'imbrication ne sont pas très compatibles avec la mémoire. Tout dépend cependant des besoins de votre application particulière. – DougW

+0

J'apprécie votre aide et votre temps ici. Le fait est que j'ai aussi loin que je peux et j'ai besoin de quelques conseils pour savoir quelle est la meilleure façon de faire comme la structure de plist quand j'ai besoin de plus d'un niveau, comme ici, c'est que je suis franchement perdu. –

Questions connexes