2010-02-06 5 views
1

J'ai un dictionnaires de couple dans une liste de propriétés, qui constituent un système de menu pour mon jeu, comme si:iPhone - NSDictionary à NSArray avec préservé pour

New game 
    Easy 
    Normal 
    Hard 
Load game 
    Recent 
    Older 
Options 
    Game 
    Sound 

etc .. Chaque élément de cette La liste est un dictionnaire. J'utilise UINavigationController et UITableViews pour afficher ce système de menus. Lorsqu'un élément est choisi, un nouveau UITableViewController est poussé dans UINavigationController, avec les éléments de cet élément choisi. Par exemple, le premier UITableView contient "New Game", "Load game", et "Options" dans son dictionnaire. Si l'utilisateur sélectionne des options, un nouveau UITableViewController est créé avec les éléments "Game" et "Sound" (c'est-à-dire le dictionnaire de "Options").

Je renseignez la UITableView de cette façon:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] init] autorelease]; 
    } 

    // Set up the cell... 

    cell.text = [[[data keyEnumerator] allObjects] objectAtIndex:indexPath.row]; 

    // Data is the dictionary.. 

    return cell; 
} 

Mais apparemment, qui cause les éléments à ne pas venir dans le même ordre que sont définis dans la liste des propriétés.

Est-ce que quelqu'un sait comment préserver l'ordre quand je fais ce que j'essaie de faire?

Merci.

Répondre

5

Les dictionnaires ne conservent jamais l'ordre. Vous devrez utiliser un tableau. Vous pouvez soit utiliser un tableau à la place (je ne vois pas pourquoi vous auriez besoin d'un dictionnaire dans votre exemple), soit créer un tableau qui indexe le dictionnaire. Donc, commencez par le dictionnaire que vous avez maintenant, créez un tableau, faites une boucle dans le dictionnaire et réglez les valeurs du tableau sur les touches du dictionnaire.

Donc, si votre dictionnaire ressemblait à ceci

Game Types 
    easy: Easy 
    normal: Normal 
    hard: Hard 

Votre tableau ressemblerait à ceci: [ "facile", "normal", "dur"] (rien de tout cela est un code objectif c). Vous pourriez alors utiliser la ligne suivante.

[myDictionary objectForKey:[myArray objectAtIndex: indexPath.row]] 
+0

Mais vraiment, donnez à chaque contrôleur de vue un NSArray distinct avec ses options correspondantes. N'utilisez pas un dictionnaire imbriqué –

+0

Merci. Ce que j'ai fini par faire était d'avoir une série de dictionnaires. Chaque dictionnaire a un champ de titre et un champ d'options, où les options sont un nouveau tableau avec plus de ces dictionnaires. – quano

3

Les dictionnaires ne doivent pas être pris en compte pour préserver l'ordre. C'est le point d'un tableau.

Vous avez besoin d'un tableau d'objets de dictionnaire qui ont un titre et une liste d'options.

NSArray *options = [NSArray arrayWithObjects:@"Easy",@"Normal",@"Hard",nil]; 

NSDictionary *newGame = [[[NSDictionary alloc] initWithObjectsAndKeys:@"New game", @"title", options, @"options",nil]autorelease]; 

Votre table de haut niveau affiche le titre de chaque sous-page, et chaque sous-page affichera une table de ses options.

Questions connexes