iPhone - NSDictionary для NSArray с сохраненным порядком - PullRequest
1 голос
/ 06 февраля 2010

У меня есть пара словарей в списке свойств, которые составляют систему меню для моей игры, например:

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

и т. Д. Каждый элемент в этом списке является словарем.

Я использую UINavigationController и UITableViews для отображения этой системы меню. Когда элемент выбран, новый UITableViewController помещается в UINavigationController вместе с элементами этого выбранного элемента. Например, первый UITableView содержит «New Game», «Load game» и «Options» в своем словаре. Если пользователь выбирает параметры, создается новый UITableViewController с элементами «Игра» и «Звук» (то есть словарь «Параметры»).

Я заполняю UITableView следующим образом:

- (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;
}

Но, по-видимому, это приводит к тому, что элементы не отображаются в том же порядке, в котором они определены в списке свойств.

Кто-нибудь знает, как сохранить порядок при выполнении того, что я пытаюсь сделать?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 06 февраля 2010

Словари никогда не сохраняют порядок. Вам нужно будет использовать массив. Вместо этого вы можете использовать массив (я не вижу причин, по которым вам нужен словарь из вашего примера), или вы можете создать массив, который индексирует словарь.

Итак, начните с имеющегося у вас словаря, создайте массив, переберите словарь и установите значения массива для ключей в словаре.

Так что, если ваш словарь выглядел так

Game Types
    easy: Easy
    normal: Normal
    hard: Hard

Ваш массив будет выглядеть так: ["easy", "normal", "hard"] (ничего из этого не является объективным кодом c). Затем вы можете использовать следующую строку.

[myDictionary objectForKey:[myArray objectAtIndex: indexPath.row]]
3 голосов
/ 06 февраля 2010

Словари не должны рассчитывать на сохранение порядка. Это точка массива.

Вам нужен массив объектов словаря, которые имеют заголовок и список параметров.

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

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

В вашей таблице верхнего уровня будет отображаться заголовок каждой вложенной страницы, а на каждой вложенной странице будет отображаться таблица ее параметров.

...