Перенос объектов из одного массива в другой - PullRequest
0 голосов
/ 21 августа 2011

Я столкнулся с небольшой проблемой. У меня есть UITableView с 2 разделами: папки и отдельные сообщения (чернила). Сообщения сохраняются в NSMutableArray, а папки представляют собой массив массивов, которые содержат сообщения. Когда вы нажимаете кнопку «Изменить», в каждой ячейке появляются флажки, которые позволяют проверять каждое сообщение. После проверки элемента он удаляется из массива inks и перемещается во временный массив. После выбора папки, в которую вы хотите переместить сообщения, элементы из временного массива копируются в один из массивов папок. Причина, по которой я использую временный массив для передачи элементов, заключается в том, что пользователь снимает отметку с элемента, чтобы таким образом он не удалялся из фактического массива.

-(IBAction)checkMarkSelected:(id)sender
{
    if(numberTimesChecked%2==0) { //even times, check
        [appDelegate.inksToFolder addObject:[appDelegate.inks objectAtIndex:[sender tag]]];
        [tempArray removeObjectAtIndex:[sender tag]]; //tempArray is initialized with the contents of appDelegate.inks in the viewDidAppear method, so its just a duplicate
    }
    else //odd times, no check
    {
        [appDelegate.inksToFolder removeObjectAtIndex:[sender tag]];
        [tempArray addObject:[appDelegate.inks objectAtIndex:[sender tag]]];
    }
    numberTimesChecked++;  }

-(IBAction)moveToFolderPressed:(id)sender
{
    NSMutableArray *arrayOfInks=[appDelegate.folders objectAtIndex:[sender tag]];
    [arrayOfInks addObjectsFromArray:appDelegate.inksToFolder];
    [appDelegate.folders replaceObjectAtIndex:[sender tag] withObject:arrayOfInks];
}

Так что проблема, с которой я сталкиваюсь, заключается в том, что делать, если пользователь нажимает на флажок более одного раза. Если пользователь нажимает на нее четное количество раз, это означает, что флажок присутствует, а если нечетное количество раз, то флажок отсутствует, и к этим элементам не следует прикасаться. Однако, когда элемент проверяется и говорят, что этот элемент находится в индексе 4 в массиве чернил, этот элемент перемещается в tempArray с индексом 0. Если затем он не отмечен, как он узнает, откуда удалить элемент в tempArray ? Поэтому, если я проверю индекс 4, затем индекс 2, затем индекс 7, затем снимите флажок с индекса 4, он попытается удалить объект из индекса 4 из массива inksToFolder, но этот индекс не существует. Кто-нибудь знает решение или даже лучший способ реализовать все это?

1 Ответ

1 голос
/ 23 августа 2011

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

Но если вы просто хотите обойтись, чтобы закончить текущую технику, то, возможно, вы могли бы использоватьNSMutableDictionary как ваше временное хранилище.

Запишите объект в словарь:

[myDictionary setObject:myObject forKey:someKey];

пример для ключа:

[myDictionary setObject:myObject forKey:[NSNumber numberWithInt:[sender tag]];

Вы можете использовать тег [sender] в качестве ключа в словаре, если вы сначала включите его в NSNumber (ключи NSMutableDictionary должны соответствовать протоколу NSCopying, а NSNumber именно так и поступает).

Найти объект на основе его ключа в словаре:

[myDictionary objectForKey:someKey];

Удалите объект на основе его ключа в словаре:

[myDictionary removeObjectForKey:someKey];

После того, как пользователь выполнил все свои проверки и снятие отметки, и он совершил перемещение, затем, чтобы получитьобъекты из вашего временного словаря и обратно в массив вы можете:

Извлечь все ключи из словаря:

NSArray *keysArray = [myDictionary allKeys];

Перебрать всю эту обри вставьте объекты словаря обратно в исходный массив:

[myDictionary objectForKey:someKey];

Используйте NSNumber -intValue, чтобы преобразовать ключ обратно в целое число, чтобы выполнить вставку обратно в исходный массив:

[myOriginalArray insertObject:myObject atIndex:[someKey intValue]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...