从数组中删除对象并不是完全删除项目
Posted
技术标签:
【中文标题】从数组中删除对象并不是完全删除项目【英文标题】:Deleting an object from an array is not completely deleting item 【发布时间】:2014-01-20 10:19:08 【问题描述】:基本上我有一个复选框列表,我将它们作为复选标记启用并创建一个 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 个字典的数组而不是一个字典? 使用remove object at index解决问题 【参考方案1】:removeObjectForKey
用于从字典中删除条目。数组没有键,它们有索引
removeObjectAtIndex:
用于从数组中删除一个元素。
您一直在清空字典的内容,而不是删除它。
另外,如果这是你的数据结构,为什么你需要一个字典数组?为什么不只是一本多对的字典?
【讨论】:
【参考方案2】:***foe 提出的问题是正确的,为什么不使用这样的单一字典...
@
@"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>
但是,您目前正在做的事情很好,但您没有正确看待它。
您当前有一个包含三个字典的数组。每个字典都有一个 key/value pari。
当您执行removeObjectForKey
时,您将获得其中一个字典并删除键/值对。字典仍然存在。
如果您想删除字典,那么您需要执行类似...
[pizzaArray removeObjectAtIndex:theIndexOfThePizza];
这将彻底删除字典。
【讨论】:
【参考方案3】:当您使用 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
【讨论】:
以上是关于从数组中删除对象并不是完全删除项目的主要内容,如果未能解决你的问题,请参考以下文章
从数组中删除项目(来自 API 的带有 JSON 的 Restkit 项目)