【问题标题】:Embed an Array into Dict structure in plist将数组嵌入到 plist 中的 Dict 结构中
【发布时间】:2013-02-25 19:03:36
【问题描述】:

我是 iOS 的初学者。我找到的每个资源在 plist 中的字典中只有键字符串对。

<key></key>
<string></string>

我想知道是否可以让结构中的一个对象成为一个键对,其中对象是一个数组。在我的 plist 中,我的结构如下。第一个字典包含可变数量的键字符串对,这些键字符串对可能存在也可能不存在于 plist 中。我的代码检查是否存在某些键。但是,我想添加一个数组,该数组将包含此初始字典所需的任意数量的主菜。下面的代码不起作用,但这是我想做的。

<array>
    <dict>
        <key>title</key>
        <string>SomeTitle</string>
             .
             .
             .
        <key>filters</key>
        <array>???

        </array>???
    </dict>
</array>

【问题讨论】:

  • 是的,您可以将数组作为字典中的值。使用 Xcode 的 plist 编辑器来执行此操作。或者至少使用它来帮助您入门。比编辑原始 XML 更不容易出错。
  • plist 将被放置在服务器上,由其他开发人员编写,而无需访问 xcode 或一般的 mac。所以我一直在寻找正确的方法来编码 XML,然后在代码中解析它。
  • 没关系。在 Xcode 中创建一个示例 plist,并将其用作您需要在没有 Xcode 的情况下创建的实际 plist 文件的基础。

标签: ios plist


【解决方案1】:

为了让您能够使用initWithContentsOfFile: 方法加载plist 文件,它需要是正确的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>PageTitle</key>
        <string>Title</string>
        <key>Filters</key>
        <array>
             <dict>
                 <key>Filter</key>
                 <string>SomeFilter</string>
                 <key>Param</key>
                 <string>SomeParam</string>
             </dict>
        </array>
    </dict>
</array>
</plist>

另外,这一行:

NSMutableArray* filters = [[[NSMutableArray alloc] initWithArray:[dict objectForKey:@"Filters"]] retain];

应该是:

NSMutableArray* filters = [dict[@"Filters"] mutableCopy];

【讨论】:

  • 好的,我试试第二行谢谢。我应该添加 plist 标头,我只是复制了数组部分,它实际上具有正确的 plist 格式,那是我的错。
  • 这实际上回答了我关于如何在 plist 中获取数组的原始问题,所以我接受了。 dict 变量仍然只包含“PageTitle”键,没有“Filters”,但这是一个不同的问题。
【解决方案2】:

使用

<key>SomeKey</key>
<array>
</array>

毕竟我们是正确的。我的解析代码没认出来。

我正在使用解析代码

NSMutableArray* propertyList = [[NSMutableArray alloc] initWithContentsOfFile:path];
NSMutableDictionary* dict = [propertyFile objectAtIndex:0];
NSMutableArray* filters = [[[NSMutableArray alloc] initWithArray:[dict objectForKey:@"Filters"]] retain];

的 plist
<array>
    <dict>
        <key>PageTitle</key>
        <string>Title</string>
        <key>Filters</key>
        <array>
             <dict>
                 <key>Filter</key>
                 <string>SomeFilter</string>
                 <key>Param</key>
                 <string>SomeParam</string>
             </dict>
        </array>
    </dict>
 </array>

【讨论】:

  • 什么“解析”代码?为什么不直接使用 NSArray arrayWithContentsOfFile: 将 plist 加载到数组中?
  • 我是,但它不认识它。
  • 抱歉,什么编辑?确保您的文件是正确的 plist 文件。这必须包括标准 xml 标头和 doctype 以及 plist 根标记。
  • 抱歉没有发布,现在有了吗。 dict 变量只有一个条目,即 PageTitle 键。
  • 查看我的答案以获得解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2010-10-19
  • 1970-01-01
  • 2017-11-03
相关资源
最近更新 更多