Удаление из 2 массивов словарей - PullRequest
1 голос
/ 06 мая 2010

У меня есть массив словарей, загруженных из plist (ниже) с именем arrayHistory.

<plist version="1.0">
<array>
    <dict>
        <key>item</key>
        <string>1</string>
        <key>result</key>
        <string>8.1</string>
        <key>date</key>
        <date>2009-12-15T19:36:59Z</date>
    </dict>
...

</array>
</plist>

Я фильтрую этот массив на основе 'item', так что второй массив, arrayHistoryDetail, имеет ту же структуру, что и arrayHistoryно содержит только, например, 'item's равен' 1 '.Эти детали подробно отображаются в табличном представлении.

Затем я хочу выбрать элемент из tableView и удалить его из источника данных tableView, arrayHistoryDetail (строка 2 в коде ниже) - работает, затем я хочу удалить элемент из самого tableView (строка 3 в коде ниже) - тоже работает.

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

NSMutableDictionary *tempDict;
@property (nonatomic, retain) NSMutableDictionary *tempDict;

Затем я подумал:копия в строке 1 и удаление ее из исходного массива в строке 4.

1   tempDict = [arrayHistoryDetail objectAtIndex: indexPath.row];
2   [arrayHistoryDetail removeObjectAtIndex: indexPath.row]; 
3   [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
4   [arrayHistory removeObject:tempDict];

Не работает.Может ли кто-нибудь, пожалуйста, направить меня в правильном направлении.Я думаю, что tempDict является указателем, и что removeObject нуждается в копии?Я не знаю.

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Несколько предложений, чтобы людям было проще ответить на такой вопрос:

  1. Вместо того, чтобы просто сказать «не сработало», приведите некоторые подробности о природе проблемы. Это привело к ошибке во время выполнения? Если это так, и на консоли появилось сообщение об ошибке, попробуйте включить это в свое сообщение.
  2. Включить в пример объявления переменных и методов экземпляра. В этом случае было бы полезно узнать, как было объявлено arrayHistoryDetail.

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

Кроме того, я не вижу смысла делать tempDict переменной экземпляра; просто объявите его как локальную переменную внутри вашего метода.

0 голосов
/ 06 мая 2010

Несколько вещей, чтобы попробовать:

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

NSMutableArray * arrayHistory;

Далее, я бы не использовал ivar со свойством только для временной переменной. Вместо этого ваш код может выглядеть примерно так и избежать свойства ivar / для tempDict:

NSDictionary * tempDict;
tempDict = [[arrayHistoryDetail objectAtIndex:indexPath.row] retain];
[arrayHistoryDetail removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath
                 withRowAnimation:UITableViewRowAnimationFade];    
[arrayHistory removeObject:tempDict];
[tempDict release];

В-третьих, убедитесь, что код, который вы используете для генерации arrayHistoryDetail, не создает копию данных в arrayHistory при выполнении фильтрации. Если он копирует элементы, то tempDict будет содержать только копию словаря, который вы хотите удалить, что означает, что у него будет значение указателя, отличное от фактического словаря в arrayHistory. Метод removeObject требует точного указателя на объект, который вы намереваетесь удалить.

Если копирование действительно вызывает проблемы, возможно, вам придется немного изменить структуру данных. Лучшим вариантом было бы назначить уникальный идентификатор каждому словарю в arrayHistory и использовать эту информацию, чтобы определить, какой словарь удалить.

0 голосов
/ 06 мая 2010

Почему бы просто не использовать

[arrayHistory removeObjectAtIndex: indexPath.row];

??

...