我正在尝试正确显示uiTableView的节和行。

我已经从一位撰稿人那里获得了很大的帮助,并且几乎可以解决我的问题。可以在here中看到该问题。不远处是正确的,只是需要排序的部分。

它是重复章节标题,而不是只显示一次。我不确定如何解决此问题。

// Find out the path of recipes.plist
    NSString *path = [[NSBundle mainBundle] pathForResource:@"lawpolice" ofType:@"plist"];

    // Load the file content and read the data into arrays
    self.dataArray = [NSArray arrayWithContentsOfFile:path];

    //Sort the array by section
    self.sortedArray = [self.dataArray sortedArrayUsingDescriptors:@[
                                                                     [NSSortDescriptor sortDescriptorWithKey:@"Section" ascending:YES],
                                                                     [NSSortDescriptor sortDescriptorWithKey:@"Title" ascending:YES]]];

    self.temp = [[NSMutableDictionary alloc] init];
    for (NSDictionary *dict in self.sortedArray) {
        NSMutableArray *array = self.temp[dict[@"Section"]];
        // No items with the same section key stored yet, so we need to initialize a new array.
        if (array == NULL) {
            array = [[NSMutableArray alloc] init];
        }

        // Store the title in the array.
        [array addObject:dict[@"Title"]];

        // Save the array as the value for the section key.
        [self.temp setObject:array forKey:dict[@"Section"]];
    }

    self.policePowers = [self.temp copy]; // copy returns an immutable copy of temp.

 //Section for sorting
    self.sectionArray = [self.sortedArray valueForKeyPath:@"Section"];
    NSLog(@"%@", self.sectionArray);

    //Title
    self.namesArray = [self.sortedArray valueForKeyPath:@"Title"];
    //Offence
    self.offenseArray = [self.sortedArray valueForKeyPath:@"Offence"];
    //Points to Prove
    self.ptpArray = [self.sortedArray valueForKeyPath:@"PTP"];
    //Action
   self.actionsArray = [self.sortedArray valueForKeyPath:@"Actions"];
    //Notes
   self.notesArray = [self.sortedArray valueForKeyPath:@"Notes"];
    //Legislation
   self.legislationArray = [self.sortedArray valueForKeyPath:@"Legislation"];
    //PNLD
   self.pnldArray = [self.sortedArray valueForKeyPath:@"PNLD"];
    //Image
    self.imageString = [self.sortedArray valueForKeyPath:@"image"];




titleForHeaderInSection

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [self.sectionArray objectAtIndex:section];
}


numberOfSectionsInTableView

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return [self.policePowers count];
    }


numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSArray *sectionrows = self.policePowers[self.sectionArray[section]];
    return [sectionrows count];
}


更新资料

要明确的是,如果两个项目具有相同的Section值,我想将它们自动分组为一个数组,并将该数组最后映射到Section值

最佳答案

NSDictionary dictionaryWithObjects:forKeys:基本上遍历两个数组,并将对象在当前索引处的一个数组映射为该对象在另一个索引处的对象的键。打电话时

self.policePowers = [NSDictionary dictionaryWithObjects:self.namesArray forKeys:self.sectionArray];


因此,它将self.sectionArray中的项目映射为self.namesArray中的项目的键。查看您的plist文件,“标题”键路径(映射到self.namesArray)具有字符串值,因此您的NSLog结果很有意义,因为self.namesArray是字符串数组,而不是数组数组。

我不确定你应该如何得到这样的结果

"Alcohol: Licensing/Drive unfit" = {
     "Drive/attempt to drive/in charge whilst unfit or over",
     "Drive/attempt to drive/in charge whilst unfit or over",
     "Drive/attempt to drive/in charge whilst unfit or over",
 }


该数组应该从哪里来?

-编辑-

我认为没有一种简洁的方法可以完成您想要的操作,因此必须手动完成。我以前实际上没有使用过[NSArray arrayWithContentsOfFile:path],所以self.dataArray是一个字典数组,每个项目代表plist中的一个项目(项目44,项目45等)吗?如果是这样,您可以执行以下操作:

NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];
for (NSDictionary *dict in self.dataArray) {
    NSMutableArray *array = temp[dict[@"Section"]];
    // No items with the same section key stored yet, so we need to initialize a new array.
    if (array == null) {
        array = [[NSMutableArray alloc] init];
    }

    // Store the title in the array.
    [array addObject:dict[@"Title"]];

    // Save the array as the value for the section key.
    [temp setObject:array forKey:dict[@"Section"]];
}

self.policePowers = [temp copy]; // copy returns an immutable copy of temp.


-再次编辑-
该应用程序崩溃是因为self.policePowersNSDictionary,而不是NSArray;因此它没有objectAtIndex:方法。如果您要获取章节标题,请尝试以下方法:

return [self.sectionArray objectAtIndex:section];


此外,如果您使用的是表格视图,基本上我会按照自己喜欢的方式对self.sectionArray进行排序,然后每当需要在每个部分中填充数据时,我都会使用self.policePowers[self.sectionArray[section]]返回映射的标题数组该部分标题。

- 完后还有 -
如果将其分解为以下几行,NSRangeException会放在哪里?如果您NSLog,结果是否符合您的期望?

NSString *title = self.sortedKeys[indexPath.section];
NSArray *array = self.policePowers[title];
NSString *value = array[indexPath.row];

关于ios - 创建NSDictionary以计算numberOfRowsInSection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23547148/

10-10 18:37
查看更多