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

Posted

技术标签:

【中文标题】iPhone - 帮助在 UITableView 中添加 9 个不同的部分【英文标题】:iPhone - Help with adding 9 different sections inside a UITableView 【发布时间】:2011-03-12 11:55:12 【问题描述】:

我有一个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】:

我将从以不同的方式组织您的数据源开始。

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

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

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

numberOfSections 可以通过[datasource count] 访问

titleForSection 可以通过[[datasource objectAtIndex:indexPath.section] valueForKey:@"catName"]访问

numberOfRowsInSection 可以通过[[[datasource objectAtIndex:indexPath.section] valueForKey:@"objects"] count] 访问

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

有意义吗? 如果您有任何问题,请告诉我。 干杯, 罗格

[编辑以回答您的后续问题]

这是基于一些假设,但您应该了解它的要点。为了测试这一点,我创建了一个 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

【讨论】:

有道理,但你能详细说明一下数据源的创建吗? @Fulvio 我做了一些假设 - 请参阅编辑后的帖子。还有一种替代方法是使用 NSFetchedResultsController 但如果您的数据不会一直更改(并且必须相应地刷新表),上述结果应该会达到类似的效果。如果是这种情况,请查看获取的结果控制器文档以了解详细信息。 我有一个日期,它是 MyObject 的一个属性。理想情况下,我希望能够按日期降序对数据进行排序。因此,因此将首先显示最新的项目(因此显然根据第一个项目/部分是什么,每次都以不同的顺序显示这些部分)。非常感谢您当前的回答,我肯定会使用这个并接受这个作为答案,但我只是想知道您是否也可以帮我订购?谢谢。 @Fulvio 不用担心 - 这里有一个很好的参考资料可以帮助您进行排序***.com/questions/805547/… 我看到了那个参考,试图以我认为可行的方式实现它,但是我只能对每个部分中的数据进行排序。我所追求的是按照数据的顺序对这些部分进行排序——如果这有意义的话。

以上是关于iPhone - 帮助在 UITableView 中添加 9 个不同的部分的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 5 UITableView 不显示

iPhone:UITableView 部分

在 iPhone 中为 UITableView 设置列标题文本

将 UITableView 大小调整为 iPhone 5/5s

自定义 UITableView - iphone

在 UITableView 中的 iPhone 上异步加载 JSON