从数组中删除对象并不是完全删除项目

时间:2014-01-20 10:19:09

标签: ios objective-c nsmutablearray plist nsmutabledictionary

基本上我有一个选中复选框的列表,我将它们作为复选标记并创建一个plist文件

结构: -

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>Personal</key>
        <string>Pizza1</string>
    </dict>
    <dict>
        <key>Medium</key>
        <string>Pizza2</string>
    </dict>
    <dict>
        <key>Large</key>
        <string>Pizza3</string>
    </dict>
</array>
</plist>

并进一步选择相同的项目我正在撤消复选标记,我将从数组中删除字典(使用removeObjectForKey:)并重写plist文件。

结构: -

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict/>
    <dict/>
    <dict/>
</array>
</plist>

所以问题是对象是从数组中删除但是字典仍然存在?

如何解决?

3 个答案:

答案 0 :(得分:0)

removeObjectForKey

用于从字典中删除条目。数组没有密钥,它们有索引

removeObjectAtIndex:

用于从数组中删除元素。

您一直在清空其内容的字典,而不是删除它。

另外在旁注中,如果这是您的数据结构,为什么还需要一个字典数组?为什么不只是一个有多对的字典?

答案 1 :(得分:0)

Trojanfoe正确地问为什么不要只使用一个字典......

@{
    @"Personal" : @"Pizza1",
    @"Medium" : @"Pizza2",
    @"Large" : @"Pizza3"
}

在你的plist中它看起来像这样......

<dict>
    <key1>Personal</key1>
    <string1>Pizza1</string1>
    <key2>Medium</key2>
    <string2>Pizza2</string2>
    <key3>Large</key3>
    <string3>Pizza3</string3>
</dict>

但是,你现在正在做的事情还不错,但你没有正确看待它。

您目前有一个包含三个词典的数组。每个字典都有一个键/值。

当您执行removeObjectForKey时,您将获得其中一个词典并删除键/值对。字典仍然存在。

如果你想删除字典,那么你需要做一些像......

[pizzaArray removeObjectAtIndex:theIndexOfThePizza];

这将完全删除字典。

答案 2 :(得分:0)

当您使用remove removeObjectForKey时,它会从字典中删除对象而不是字典,例如,如果您想要一个包含两个对象的字典:

<dict>
    <key>Medium</key>
    <string>Pizza2</string>
    <key>Large</key>
   <string>Pizza3</string>
</dict>

你调用removeObjectForKey:@“Medium”结果将是:

<dict>
    <key>Large</key>
    <string>Pizza3</string>
</dict>

但是如果你在下面的示例中只有一个对象时调用它,则从字典中删除对象,但字典仍然会在那里但是为空。

您应该从密钥中获取对象并致电:

removeObject:

或获取对象的索引并调用:

removeObjectAtIndex