来自嵌套字典数组 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 的数组的主要内容,如果未能解决你的问题,请参考以下文章

展平字典中的嵌套数组

C ++中的嵌套字典/数组

数据过滤 Javascript(嵌套字典和数组)

如何在嵌套字典数组上使用 NSpredicate

JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray

在 swift 4 和 Xcode 9 中解码 ExpandableTableView 的嵌套 json 数组