基本上我有一个选中复选框的列表,我将它们作为复选标记并创建一个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>
所以问题是对象是从数组中删除但是字典仍然存在?
如何解决?
答案 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