从NSDictionary中删除密钥

时间:2011-10-24 22:12:36

标签: ios uitableview nsdictionary nsuserdefaults

在我的应用中,我在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中的数据,然后删除键3中的剩余副本。然后counterKey会递减(因为这是我用来跟踪存在多少个键的数字,因此我可以告诉UITableView需要创建多少个单元)。或者至少这是我认为应该做的事情。

但它没有做我认为它应该做的事情;当一个单元被标记为删除时,真正发生的是该键的数据显示为NULL,并且键不会像我认为的那样“滑动”。

done:方法解除信息视图(包含删除按钮和有关所选行的信息)并返回到包含UITableView的视图。

这个概念是否有意义,如果是这样,为什么它不起作用?谢谢你的时间。

***编辑:

谢谢你,jrturton,使用NSArray工作,但有时删除它(或尝试)崩溃时出现此错误:

*由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:' - [__ NSCFArray removeObjectAtIndex:]:发送到immutable对象的mutating方法' * 第一次抛出调用堆栈: (0x14c7052 0x1658d0a 0x146fa78 0x146f9e9 0x14c109f 0xd381 0x8cba1f 0x14c8ec9 0x5105c2 0x51055a 0x5b5b76 0x5b603f 0x5b52fe 0x535a30 0x535c56 0x51c384 0x50faa9 0x24adfa9 0x149b1c5 0x1400022 0x13fe90a 0x13fddb4 0x13fdccb 0x24ac879 0x24ac93e 0x50da9b 0x1ef9 0x1e75)

这很奇怪,因为该类中没有一个NSArray;所有这些都是可变的。

这是崩溃的路线(我有理由相信):

NSMutableArray* outerArray = (NSMutableArray*)[defaults objectForKey:@"mapSaveDataKey"];
[outerArray removeObjectAtIndex:iii];

修正:

替换:

[defaults objectForKey:@"mapSaveDataKey"]; 

使用:

[defaults mutableArrayValueForKey:@"mapSaveDataKey"];

1 个答案:

答案 0 :(得分:1)

你在做什么似乎不必要地复杂化。为什么不在密钥(例如@"data")下的用户默认值中存储单个数组,然后删除或添加项目到该数组?这样您就不必保持单独的计数或类似的计数。例如,您可以使用objectAtIndex:来获取第4项,当您删除第2项时,无论如何,它上面的项目都会向下移动。

更新 - 正如Matthew Gillingham在评论中指出的那样,我的确意味着一个可变阵列。正如您所发现的那样,您无法改变NSArray中元素的数量或位置。

另请注意,即使您首先存储了一个可变数组,arrayForKey:也会返回NSArray,因此从默认值中获取值时,您必须执行以下操作:

NSMutableArray *myData = [NSMutableArray arrayWithArray:[defaults arrayForKey:@"data"]];

defaults是您的用户默认对象。