如何在没有NSFetchedResultsController的情况下设置Grouped UITableview节名

时间:2011-09-27 03:39:22

标签: iphone uitableview nsmutablearray

我使用了许多绑定到核心数据管理对象的分组表,其中sectionNameKeyPath值用于标识数据中应该用于表示表的节的属性。

但是当我有一个用于呈现NSMutableArray的表时,如何指示“sectionNameKeyPath equivalent”,这些对象看起来像这样:

@interface SimGrade : NSObject {
    NSNumber * scoreValue;
    NSString * commentInfo;
    NSString * catName;
}

我想根据类的“catName”成员定义部分。

例如,考虑我的mutablearray有5个条目,其中5“catName”值是“蓝色”,“蓝色”,“蓝色”,“红色”和“红色”。所以我希望该示例中表格中的部分数量为2。

因此,我想“做什么”可以用以下伪代码表示:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
     // Return the number of sections.
    return (The number of unique catNames);
}

注意:我这样做的兴趣不在于在表格中显示单独的部分,而是为了让我可以更轻松地计算每个类别的得分值总和。

<<<<<更新>>>>>>>>>>

约书亚的帮助,正如他的回答所记录的那样。以下是两个新的处理程序,包括部分数量和每个部分的行数...

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        NSMutableSet *counter = [[NSMutableSet alloc] init];
        [tableOfSimGrades enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
            [counter addObject:[object catName]];
        }];
        NSInteger cnt = [counter count];
        [counter release];
        NSLog(@">>>>> number of sections is -> %d", cnt);

        return cnt;
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        // Return the number of rows in the section.
        NSMutableDictionary *counter = [[NSMutableDictionary alloc] init];
        NSMutableArray *cats = [[NSMutableArray alloc] init];
        __block NSNumber *countOfElements;
        [tableOfSimGrades enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
            // check the dictionary for they key, if it's not there we get nil                                                                                                                                                                      
            countOfElements = [counter objectForKey:[object catName]];
            if (countOfElements) {
                // NSNumbers can't do math, so we use ints.                                                                                                                                                                                           
                int curcount = [countOfElements intValue];
                curcount++;
                [counter setObject:[NSNumber numberWithInt:curcount] forKey:[object catName]];
                 NSLog(@">>>>   adding object %d to dict for cat: %@", curcount, [object catName]);

            } else {
                [counter setObject:[NSNumber numberWithInt:1] forKey:[object catName]];
                [cats addObject:[object catName]];
                NSLog(@">>>>>   adding initial object to dict for cat: %@", [object catName]);

            }

        }];

        countOfElements = [counter objectForKey:[cats objectAtIndex: section]];
        int catcount = [countOfElements intValue];

        [counter release];
        [cats release];
        return catcount;

    }

我现在对这个例程的问题在于以下函数...它不知道nsmutableArray中的任何部分,因此对于每个部分,它从数组的索引0开始,而不是在相应的第0个元素处开始部分。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell =  [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...        
    SimGrade *tmpGrade = [[SimGrade alloc] init];
    tmpGrade = [tableOfSimGrades objectAtIndex: indexPath.row];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"Category: %@", tmpGrade.catName];

   // [tmpGrade release];
   return cell;
}

如何将发送到此例程的“indexpath”转换为mutableArray的相应部分?

谢谢,

菲尔

1 个答案:

答案 0 :(得分:1)

你可以这样做:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSMutableSet *counter = [[NSMutableSet alloc] init];
    [arrayOfSims enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
        [counter addObject:object.catName];
    }];
    NSInteger cnt = [counter count];
    [counter release];
    return cnt;
}

出于性能原因,您可能想要记住这一点(但仅在对其进行分析后)。

---编辑---

您也可以使用NSMutableDictionary来获取各个类别的计数。

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
   {
    NSMutableDictionary *counter = [[NSMutableDictionary alloc] init];
    __block NSNumber *countOfElements;
    [arrayOfSims enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
      // check the dictionary for they key, if it's not there we get nil                                                                                                                                                                      
      countOfElements = [counter objectForKey:object.catName];
      if (countOfElements) {
        // NSNumbers can't do math, so we use ints.                                                                                                                                                                                           
        int curcount = [countOfElements intValue];
        curcount++;
        [counter setObject:[NSNumber numberWithInt:curcount] forKey:object.catName];
      } else {
        [counter setObject:[NSNumber numberWithInt:1] forKey:object.catName];
      }

    }];
  NSInteger cnt = [counter count];
  // we can also get information about each category name, if we choose                                                                                                                                                                       
  [counter release];
  return cnt;
}