来自嵌套字典数组 Xcode 的数组
Posted
技术标签:
【中文标题】来自嵌套字典数组 Xcode 的数组【英文标题】:Array from nested dictionary array Xcode 【发布时间】:2013-02-06 10:53:52 【问题描述】:我创建了一个如下的 plist 文件,所有部分都遵循相同的结构:
<array>
<dict>
<key>image</key>
<string>gradient1.png</string>
<key>name</key>
<string>Section 1</string>
<key>list</key>
<array>
<dict>
<key>questionTitle</key>
<string>How are you doing?</string>
<key>questionInfo</key>
<string>questionInfo1</string>
</dict>
<dict>
<key>questionTitle</key>
<string>What are you doing?</string>
<key>questionInfo</key>
<string>questionInfo2</string>
</dict>
<dict>
<key>questionTitle</key>
<string>Where are you going</string>
<key>questionInfo</key>
<string>questionInfo3</string>
</dict>
</array>
</dict>
我在嵌套表中使用它。我使用“名称”作为部分标题,并希望创建一个包含不同问题及其相关信息的新数组..
- (void) setCategoryArray
NSURL *url = [[NSBundle mainBundle] URLForResource:@"QuestionList" withExtension:@"plist"];
NSArray *mainArray = [[NSArray alloc] initWithContentsOfURL:url];
NSMutableArray *categoryArray = [[NSMutableArray alloc] initWithCapacity:[mainArray count]];
for (NSDictionary *dictionary in mainArray)
Category *category = [[Category alloc] init];
category.name = [dictionary objectForKey:@"name"];
category.list = [dictionary objectForKey:@"list"];
questionList = category.list;
NSLog(@"%@", questionList);
category.image = [dictionary objectForKey:@"image"];
[categoryArray addObject:category];
NSMutableArray *questionArray = [[NSMutableArray alloc] initWithCapacity:nil];
for (NSDictionary *dictionary in questionList)
Category *question = [[Category alloc] init];
question.questionTitle = [dictionary objectForKey:@"questionTitle"];
question.questionInfo = [dictionary objectForKey:@"questionInfo"];
[questionArray addObject:question];
self.categoryList = categoryArray;
self.questionList = questionArray;
认为这可能是我如何创建 questionArray 或我在表格标签中引用它的方式的问题(见下文),但我为每个单元格获得相同的条目(但它不是第一个或最后一个重复的条目)。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"SavedCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
Category *question = (Category *)[self.questionList objectAtIndex:indexPath.section];
UILabel *questionNameLabel = (UILabel *)[cell viewWithTag:101];
questionNameLabel.text = question.questionTitle;
return cell;
非常感谢您的帮助!
【问题讨论】:
我以前从未见过initWithCapacity:nil
。在你的questionArray
上为什么不直接做NSMutableArray *questionArray = [[NSMutableArray alloc] init];
谢谢,我认为 plist 中的内容会填充数组,所以如果从零开始就很重要...尽管在每个单元格中仍然显示相同的内容 - 有什么想法吗?
您能否解释一下您希望显示的内容。据我了解,您的每个部分都是一个类别列表,并且该部分中包含每个问题的行?
我想在每个单元格中显示“questionTitle”(参见第二个代码块).. questionTitles 及其相关信息都包含在字典中,这些信息包含在每个部分的数组中。目前的问题是它为每个单元格显示相同的 questionTitle .. 感谢您的帮助
我发现这是最后一节的第一个 questionTitle 在每个单元格中重复 - 知道为什么会发生这种情况吗?
【参考方案1】:
好的,我想我已经找到了你的问题。
您在第一个 for 循环中将 questionList
设置为 category.list
。该 for 循环在运行 questionArray
循环之前完成(因此第二个 for 循环只会运行一个 questionList
- 最后一个)。
我认为您所追求的解决方案是将第二个 for 循环放在第一个中:
for (NSDictionary *dictionary in mainArray)
Category *category = [[Category alloc] init];
category.name = [dictionary objectForKey:@"name"];
category.list = [dictionary objectForKey:@"list"];
category.image = [dictionary objectForKey:@"image"];
[categoryArray addObject:category];
NSMutableArray *questionArray = [[NSMutableArray alloc] initWithCapacity:nil];
for (NSDictionary *dictionary in category.list)
Category *question = [[Category alloc] init];
question.questionTitle = [dictionary objectForKey:@"questionTitle"];
question.questionInfo = [dictionary objectForKey:@"questionInfo"];
[questionArray addObject:question];
[self.questionList addObject:questionArray];
self.categoryList = categoryArray;
然后cellForRowAtIndexPath
中的问题将是:
Category *question = (Category *)[[self.questionList objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
我还没有对此进行测试,但希望它能够工作 - 或者使用一些 NSLog,让我们更接近一个可行的解决方案。
【讨论】:
感谢 Patrick,我认为您对循环的看法是正确的。问题已添加到 questionArray 中,但 questionList 始终为空,无论我将其放在循环中还是之外 啊,for (NSDictionary *dictionary in category.list)
这行可能有问题,如果你在里面放一个NSLog,应该什么都不会发生?
啊好的,我为问题列表添加了一个惰性实例化,它不再总是为空,而是仅将最后一部分的问题添加到 questionList 数组中。有任何想法吗?再次感谢
for (NSDictionary *dictionary in category.list)
在 NSLog 中显示得很好,并且可以遍历每个部分,现在的问题是只有最后一个部分的问题被添加到 questionList,不知道为什么?
完成了!我在错误的地方做self.questionList = [[NSMutableArray alloc] init]
,谢谢你的帮助!以上是关于来自嵌套字典数组 Xcode 的数组的主要内容,如果未能解决你的问题,请参考以下文章