来自 Plist 的多个数组

Posted

技术标签:

【中文标题】来自 Plist 的多个数组【英文标题】:Multiple Arrays From Plist 【发布时间】:2011-05-31 19:18:46 【问题描述】:
<?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>
  <array>
    <string>Title 1</string>
    <string>Subtitle 1</string>
    <string>image1.png</string>
  </array>
  <array>
    <string>Title 2</string>
    <string>Subtitle 2</string>
    <string>image2.png</string>
  </array>
</array>
</plist>

这是我正在开发的应用程序的 Plist 文件。

我不确定如何使用许多数组的第一个字符串来创建一个包含所有标题的 NSMutableArray,然后再创建一个包含字幕和图像名称的 NSMutableArray。

我目前的解决方法是为每种类型的字符串创建 3 个单独的 Plist 文件,这可能会很麻烦。

【问题讨论】:

【参考方案1】:

要在保留 plist 数据结构的同时回答您的问题,您可以简单地执行以下操作:

NSArray *rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"your-plist" ofType:@"plist"]];
int numItems = [rootArray count];
NSMutableArray *titles = [NSMutableArray arrayWithCapacity:numItems];
NSMutableArray *subtitles = [NSMutableArray arrayWithCapacity:numItems];
NSMutableArray *images = [NSMutableArray arrayWithCapacity:numItems];

for (NSArray *itemData in rootArray) 
    [titles addObject:[itemData objectAtIndex:0]];
    [subtitles addObject:[itemData objectAtIndex:1]];
    [images addObject:[itemData objectAtIndex:2]];

但是,我建议您使用如下结构:

<?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>title</key>
    <string>Title 1</string>
    <key>subtitle</key>
    <string>Subtitle 1</string>
    <key>image</key>
    <string>image1.png</string>
  </dict>
  <dict>
    <key>title</key>
    <string>Title 2</string>
    <key>subtitle</key>
    <string>Subtitle 2</string>
    <key>image</key>
    <string>image2.png</string>
  </dict>
</array>
</plist>

此时您可以使用如下更明确的代码:

NSArray *rootArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"your-plist" ofType:@"plist"]];
int numItems = [rootArray count];
NSMutableArray *titles = [NSMutableArray arrayWithCapacity:numItems];
NSMutableArray *subtitles = [NSMutableArray arrayWithCapacity:numItems];
NSMutableArray *images = [NSMutableArray arrayWithCapacity:numItems];

for (NSDictionary *itemData in rootArray) 
    [titles addObject:[itemData objectForKey:@"title"]];
    [subtitles addObject:[itemData objectForKey:@"subtitle"]];
    [images addObject:[itemData objectForKey:@"image"]];

【讨论】:

太好了,我试试看。我正在开发的另一个应用程序将处理更多项目,所以我需要这个。 我遇到了一个小问题。单击我的 uitableview 中的一行时,我试图获取图像。标题和副标题有效,技术上图像也有效,但图像仅在 cellForRowAtIndexPath 中有效。我需要它在 didSelectRowAtIndexPath 上工作,但是,应用程序中止并给出错误 NSCFString objectAtIndex unrecognized selector sent

以上是关于来自 Plist 的多个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 中以编程方式在 plist 文件中添加多个数组

如何在 PList 中添加多个数组

将具有多个属性的可变数组保存到 plist

如何使用 jQuery 显示来自 JSON 的多个数组?

返回多个数组中相同位置的项目

一个 plist 或多个 plist 来存储我的回复