2010-05-06 5 views
1

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

<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> 

отфильтровать этот массив на основе «» элемента таким образом, что второй массив, arrayHistoryDetail имеет такую ​​же структуру, как и arrayHistory, но только содержит, например, 'item равно' 1 '. Эти подробные элементы успешно отображаются в таблицеView.

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

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

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 нуждается в копии? Я не знаю.

Спасибо.

ответ

0

Пару вещей, чтобы попробовать:

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

NSMutableArray * arrayHistory; 

Далее, я бы не использовать Ивара с свойство только для временной переменной.Ваш код может вместо того, чтобы искать что-то вроде этого, и избежать Ивар/свойство для 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

Не знаете, почему это сработало, но спасибо. Я думал, что был здесь раньше, единственной разницей является сохранение. Для уточнения я сначала сменил tempDict на временную переменную, затем работал, но не более чем на несколько удаленных ячеек, затем отладчик начал указывать на случайные строки, добавил сохранение и стал намного более стабильным. Я собираюсь проверить любые другие проблемы с памятью, которые могли бы внести вклад, потому что я действительно не понимаю, как это удержать, возможно, исправил его, но он сделал это, может быть, я должен просто отпустить его. Еще раз спасибо. –

+0

В исходном коде, когда вы устанавливаете 'tempDict = ...', значение фактически не сохраняется. Вы устанавливаете тип свойства tempDict для сохранения, но вы обходите аксессуар свойства, поэтому он не имел никакого эффекта. Чтобы использовать исходный код как есть, вам придется использовать либо 'self.tempDict = ...', либо '[self setTempDict: ...]'. –

-1

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

[arrayHistory removeObjectAtIndex: indexPath.row]; 

??

+1

потому что indexPath.row будет иметь положение индекса объекта в arrayHistoryDetail, которое намного меньше, чем arrayHistory, и поэтому объект, который я хочу удалить, находится в другом положении, поэтому я бы удалил некоторый случайный объект из arrayHistory –

+0

Извините, Pyro2927. -1 от меня. Как указано OP, это не приведет к удалению соответствующего элемента. –

1

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

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

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

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

+0

Спасибо за ваши предложения. Я согласен со всем, что ты сказал. Я подумал о том, чтобы добавить больше деталей, но думал, что это уже слишком много, но вы правы, я должен был ответить на то, что вы просили, без необходимости спрашивать. arrayHistoryDetail - это NSMutableArray; сборка была в порядке, ошибка времени выполнения без сообщений об ошибках, нет; отладчик указал на случайную проблему с линией - память ?; пытался что-то другое исправить в другом методе и сделал tempDict ivar - должен был изменить его обратно. Когда я изменил его, чтобы выглядеть как e.James предложил, он работал. Единственное, чего у меня не было, было сохранение. –

Смежные вопросы