从2个字典数组中删除

时间:2010-05-06 16:06:17

标签: iphone nsdictionary

我有一个从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'过滤此数组,以便第二个数组arrayHistoryDe​​tail具有与arrayHistory相同的结构,但仅包含例如'item等于'1'。这些详细信息项已成功显示在tableView中。

然后我想从tableView中选择一个项目,并从tableView数据源中删除它,arrayHistoryDe​​tail(下面代码中的第2行) - 工作,然后我想从tableView本身删除该项目(第3行)下面的代码) - 也有效。

我的问题是我还需要从原来的arrayHistory中删除它,所以我尝试了以下方法:创建一个临时字典作为ivar:

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 个答案:

答案 0 :(得分:1)

一些建议让人们更容易回答这类问题:

  1. 不仅仅是说“没有用”,而是提供有关问题性质的一些细节。它是否导致运行时错误?如果是这样,并且控制台上出现错误消息,请尝试在发布中包含该消息。
  2. 在示例中包含实例变量和方法的声明。在这种情况下,了解arrayHistoryDetail的声明方式会很有帮助。
  3. 我的猜测是arrayHistoryDetail是NSArray的一个实例,并且您的应用程序在尝试将可变消息发送到不可变实例时遇到运行时错误。至少这将是第一件要检查的事情:确保arrayHistoryDetail是NSMutableArray的一个实例。

    另外,我认为没有理由让tempDict成为实例变量;只需将它声明为方法中的局部变量。

答案 1 :(得分:0)

要尝试的几件事情:

首先,确保从plist文件加载的数组是可变的,即:

NSMutableArray * arrayHistory;

接下来,我不会仅使用带有属性的ivar作为临时变量。您的代码可能看起来像这样,并避免tempDict的ivar /属性:

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

第三,确保用于生成arrayHistoryDe​​tail的代码在执行过滤时不会在arrayHistory中复制数据。如果它复制了项目,那么tempDict只会保存您要删除的字典的副本,这意味着它将具有与arrayHistory中的实际字典不同的指针值。 removeObject方法需要一个指向要删除的对象的精确指针。

如果复制确实存在问题,您可能会稍微改变一下数据结构。最好的选择是使用为arrayHistory中的每个字典分配唯一标识符,并使用该信息来确定要删除的字典。

答案 2 :(得分:-1)

为什么不使用

[arrayHistory removeObjectAtIndex: indexPath.row];

...