Удаление ключа из NSDictionary - PullRequest
1 голос
/ 25 октября 2011

В моем приложении я храню список наборов данных в NSUserDefaults.Когда к нему нужно получить доступ, я создаю массив (каждый ключ в NSUserDefaults содержит и массив данных) и использую данные.Работает отлично.Ура!К сожалению, когда я отображаю данные в UITableView, удаление одного набора данных (который == одна строка в UITableView) не работает должным образом.Вот как я собираюсь это сделать:

if(buttonIndex == actionSheet.destructiveButtonIndex)
{
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

    int iii = [defaults integerForKey:@"currentMap"];

    NSMutableDictionary* dicOne = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryRepresentation];

    for(int lll = iii; lll < [[defaults objectForKey:@"counterKey"] intValue]; lll++)
    {
        if(lll != [[defaults objectForKey:@"counterKey"] intValue] - 1)
            [dicOne setObject:[dicOne objectForKey:[NSString stringWithFormat:@"%i", (iii + 1)]] forKey:[NSString stringWithFormat:@"%i", iii]];

        else
            [dicOne removeObjectForKey:[NSString stringWithFormat:@"%i", iii]];
    }

    [defaults setPersistentDomain:dicOne forName:[[NSBundle mainBundle] bundleIdentifier]];

    [defaults synchronize];

    int counter = [defaults integerForKey:@"counterKey"];

    counter--;

    [defaults setInteger:counter forKey:@"counterKey"];

    [defaults synchronize];

    [self performSelector:@selector(done:) withObject:nil afterDelay:.3];
}

Идея этого кода состоит в том, чтобы запустить цикл for с индексом выбранной строки, которую нужно удалить (переменная 'iii').Этот метод перемещается по словарю, перемещая каждый индекс вниз по уровню.

Представьте себе словарь, содержащий пять наборов данных (пять ключей) с метками 0, 1, 2, 3 и 4. Когда 2 помечается для удаления, этот код перемещается по словарю, присваивая данные, содержащиеся включ 3 к ключу 2, данные в ключе 4 к ключу 3, а затем удаляет оставшуюся копию в ключе три.Затем counterKey уменьшается (поскольку это число, которое я использую для отслеживания того, сколько ключей существует, поэтому я могу сказать UITableView, сколько ячеек нужно создать).Или, по крайней мере, это то, что я должен сделать.

Но он не делает то, что, я думаю, должен делать;когда ячейка помечается для удаления, действительно происходит в том, что данные для этого ключа отображаются как NULL, и ключи не «скользят», как мне кажется, они должны.

Метод done: отклоняет информационное представление (которое содержит кнопку удаления и информацию о выбранной строке) и возвращает к представлению, которое содержит UITableView.

Имеет ли эта концепция смысл, и если да, то почему она не работает?Спасибо за ваше время.

*** Редактировать:

Спасибо, jrturton, использование NSArray сработало, но иногда его удаление (или попытка) вылетает с этой ошибкой:

* Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: '- [__ NSCFArray removeObjectAtIndex:]: мутирующий метод, отправленный в неизменяемый объект' * Стек вызовов первого выброса: (0x14c7052 0x1658d0a 0x146fa78 0x14xfx0x1x0x1x6x1x10x5105c2 0x51055a 0x5b5b76 0x5b603f 0x5b52fe 0x535a30 0x535c56 0x51c384 0x50faa9 0x24adfa9 0x149b1c5 0x1400022 0x13fe90a 0x13fddb4 0x13fdccb 0x24ac879 0x24ac93e 0x50da9b 0x1ef9 0x1e75)

1025 * Что странно, потому что ни один NSArray используется в этом классе;все они изменяемы.

Это строка сбоя (я вполне уверен):

NSMutableArray* outerArray = (NSMutableArray*)[defaults objectForKey:@"mapSaveDataKey"];
[outerArray removeObjectAtIndex:iii];

Исправлено:

Заменить:

[defaults objectForKey:@"mapSaveDataKey"]; 

С:

[defaults mutableArrayValueForKey:@"mapSaveDataKey"];

1 Ответ

1 голос
/ 26 октября 2011

То, что вы делаете, кажется излишне сложным. Почему бы просто не сохранить отдельный массив в пользовательских значениях по умолчанию под ключом (например, @"data"), а затем удалить или добавить элементы в этот массив? Таким образом, вам не нужно вести отдельный подсчет или что-то в этом роде. Например, вы можете использовать objectAtIndex:, чтобы удержать элемент 4, а когда вы удалите элемент 2, элементы над ним все равно сместятся вниз.

Обновление - как указывает Мэтью Джиллингем в комментариях, я имел в виду изменяемый массив Как вы обнаружили, вы не можете изменить количество или положение элементов в NSArray.

Также обратите внимание, что arrayForKey: вернет NSArray, даже если вы в первую очередь сохранили изменяемый массив, поэтому при получении значения по умолчанию вам нужно будет сделать следующее:

NSMutableArray *myData = [NSMutableArray arrayWithArray:[defaults arrayForKey:@"data"]];

Где defaults - ваш объект по умолчанию для вашего пользователя.

...