2014-01-20 156 views
0

基本上我有复选框的列表上选择其中我让他们上对勾,并创建一个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> 

所以问题对象从阵列中删除,但字典仍然存在?

如何解决?

+2

为什么3个字典而不是单一的字典一个数组? – trojanfoe

+0

在索引处使用删除对象将解决问题 – Retro

回答

0
removeObjectForKey 

用于从词典中删除条目。 Array没有密钥,它们有索引

removeObjectAtIndex: 

用于从数组中删除元素。

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

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

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]; 

这将删除字典完全。

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

和你打电话removeObjectForKey:

0

当您使用删除removeObjectForKey它从字典中没有字典,如果你想一本词典有两个对象中删除对象,例如@“中”其结果将是:

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

,但如果你把它当只有一个物体像例如下面你从词典中删除的对象,但字典仍然会存在,但空。

你应该得到重点对象,并调用:

removeObject: 

或获取对象的指数,并呼吁:

removeObjectAtIndex