iPhone - 帮助在UITableView中添加9个不同的部分

时间:2011-03-12 11:55:13

标签: iphone objective-c nsmutablearray nsdictionary nsmutabledictionary

我有NSArray个对象:

MyObject由以下字符串属性组成:

Title
Category
Name

共有9个类别。

我想在UITableView

中显示这些类别

目前我的代码看起来像这样,但它不太正确,我不确定如何处理我的

中的各个类别
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;` as well.

    for (ArrayOfMyObject *item in myArray) {
      if ([item.Category isEqualToString:@"Category1"]) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
        [self.itemsArray addObject:dict];
      }

      if ([item.Category isEqualToString:@"Category2"]) {
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:item forKey:item.Category];
        [self.itemsArray addObject:dict];
      }
      ... (etc, for the rest of the Category titles).
    }

如果有9个类别,我应该总共得到9个部分,但看起来我实际上得到了项目的总数(就像76个)。如果需要,可以非常感谢任何帮助,并随时请求更多代码。

我想我还需要知道如何在cellForRowAtIndexPath方法中处理这个问题。

我会做这样的事吗?

MyObject *item = (MyObject *)[self.itemsArray objectAtIndex:indexPath.row];
NSMutableDictionary *dictionary = [self.itemsArray objectAtIndex:indexPath.section];
NSArray *categoryArray = [dictionary objectForKey:item.Category];

1 个答案:

答案 0 :(得分:3)

我首先要以不同的方式组织您的数据源。

获取一个数据源NSArray,其中包含9个代表您的类别的NSDictionaries。在每个类别中,您有几个键 - 一个用于具有类别名称的相应字符串,另一个用于属于该类别的相应MyObject数组:

dataSource [
             item1 {
                     catName = @"CategoryName 1"
                     objects = NSArray of MyObjects for catName1
                   }
             item2 {
                     catName = @"CategoryName 2"
                     objects = NSArray of MyObjects for catName2
                   }
             etc...
           ]

以这种方式组织数据后,表视图的数据源方法将如下所示(概念上):

可以使用[datasource count]

访问numberOfSections

可以使用[[datasource objectAtIndex:indexPath.section] valueForKey:@"catName"]

访问titleForSection

可以使用[[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] count]

访问numberOfRowsInSection

最后,可以使用cellForRowAtIndexPath:方法上的[[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] objectAtIndex:indexPath.row]访问每行的MyObject。

有道理吗? 如果您有任何疑问,请告诉我。 干杯, ROG

[编辑以回答您的问题]

这是基于一些假设,但你应该得到它的要点。为了测试这个,我创建了一个MyObject类,它返回一个带有随机生成的类别名称的实例。

- (void)createDatasource
{
    NSInteger numberOfObjects = 10;
    NSMutableArray *objects = [NSMutableArray arrayWithCapacity:numberOfObjects];
    NSMutableArray *categories = [NSMutableArray arrayWithCapacity:numberOfObjects];
    for (int i = 0; i < numberOfObjects; i++)
    {
        MyObject *obj = [[MyObject alloc] init];
        [objects addObject:obj];
        [categories addObject:obj.category];
        [obj release];
    }
    NSSet *set = [NSSet setWithArray:categories];
    NSMutableArray *dataSource = [[NSMutableArray alloc] initWithCapacity:[set count]];
    for (NSString *categoryString in set)
    {
        NSMutableDictionary *mainItem = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil, @"categoryName", nil, @"myObjects", nil];
        NSMutableArray *mainItemMyObjects = [NSMutableArray array];
        [mainItem setValue:categoryString forKey:@"categoryName"];
        for (MyObject *obj in objects)
        {
            if ([obj.category isEqualToString:categoryString])
            {
                [mainItemMyObjects addObject:obj];
            }
        }
        [mainItem setValue:mainItemMyObjects forKey:@"myObjects"];
        [dataSource addObject:mainItem];
        [mainItem release];
    }
    NSLog (@"objects = %@\ncategories = %@\nset = %@\ndatasource = %@", objects, categories, set, dataSource);
    // Use and release your datasource as appropriate
    // You may want to sort your datasource appropriately depending on your needs
}