В моем приложении я храню список наборов данных в 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"];