具有原型单元格、部分的复杂 UITableView

Posted

技术标签:

【中文标题】具有原型单元格、部分的复杂 UITableView【英文标题】:Complex UITableView with Prototype Cells, Sections 【发布时间】:2013-08-24 14:27:51 【问题描述】:

我正在为复杂的 UITableView 寻找最佳解决方案。我想要什么:我有一个任意数量的部分。 本节只有一个静态单元格,然后应该有任意数量的动态单元格

我的数据存储在一些 NSMutableArray 中,我尝试过这样的想法:Combine static and prototype content in a table view 但我不知道如何处理我的问题。 那么有人可以给我一个提示或最佳实践吗?更新1 http://jsfiddle.net/konstheinrich188/HKkA8/ Fiddle 显示了我的数据的外观以及我正在尝试做什么 这张照片显示了我想如何编写我的 tableview ......

【问题讨论】:

您的问题似乎相同,那么您在实施其他问题的解决方案时遇到了什么问题? 我不知道如何用不同类型的单元格创建 x 部分。我的想法是:为 myArray 中的每个项目创建一个部分。 Foreach 部分添加一个静态单元格和 [myotherArray count] 个动态单元格... 为什么不是数组数组?外部数组是节,每个内部数组是节的动态行... 您可以使用 tableView 委托方法:-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView return [self.myArray count]; 来创建您需要的部分。将此与您阅读的主题中的答案结合使用 你所说的静态单元格不是静态的,因为它的每个部分都有不同的名称,所以你仍然需要从你的数据结构中获取它的内容。要获取每个部分中的行数,您将必须为标题单元格(您称为静态的那个)添加 SubItem 和 SubItem 2 Plus 1 中的元素计数。尝试使用您的数据结构来填充表会很复杂,因此我可能会先将该数据解析为数组数组以使其更简单。 【参考方案1】:

当您使用“静态”一词时,您真的是在谈论“uitableview 静态单元格”,还是“具有静态内容的单元格”? 如果是前者;你为什么需要那个? 如果是后者;如何在每个部分中测试这是否是该部分中的第一个单元格,然后呈现静态内容?对于所有其他单元格,显示动态内容:

if (indexPath.row == 0) 
    // First row in section. Display static content
    ...
 else 
    // Display dynamic content
    ...

出于什么目的需要静态单元格?

【讨论】:

顺便说一句,带有数组的数组完全可以用于您的设置。您可能希望在内容数组中添加虚拟条目以匹配每个部分中的静态第一个单元格。 为什么要在第一节行中而不是在节标题中的项目名称?我想象它是这样的:你的“物品”可能是一张音乐唱片。您知道该记录有一个名称 (item.name),但您不知道一条记录可以有多少轨道(子项)。因此,对于您的记录集合,您需要为每条记录设置一个部分,并为曲目设置任意数量的行。这是否符合您的数据类型?如果是这样,请使用节标题而不是“静态单元格”,然后为子项使用普通的动态单元格。 你说得对,只是为了测试!我的部分标题变成了另一个描述.. 您可以通过使用一个数组作为节标题(记录名称),使用一个数组作为子项(曲目名称)来完成此操作。 如果 subitem1 和 subitem2 字段都在同一个部分中,您提供的代码如何提供视觉线索来区分它们?【参考方案2】:

所以经过一段时间的测试并听取您的想法和技术后,我解决了我的问题! 这是一个小代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return [mappedSprints count];


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section


    UISprint*s = [mappedSprints objectAtIndex:section];
    return s._name;



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    UISprint* s = [mappedSprints objectAtIndex:section];
    return [s.internalUserStorey count] + [s.externalUserStorey count] + 1;


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    if (indexPath.row == 0) 
        return 130;
    
    return 80;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"Cell%d%d", indexPath.row, indexPath.section]];

            if (cell == nil) 
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Cell%d%d", indexPath.row, indexPath.section]];
            

    UISprint*s = [mappedSprints objectAtIndex:indexPath.section];


    if (indexPath.row == 0) 
        //Here is my first cell 
        //cell.textLabel.text =s._name;


    
    else if(indexPath.row >= 0 && indexPath.row<=[s.internalUserStorey count])

       //here are the cells for SubItem


    

    else if(indexPath.row >= [s.internalUserStorey count])


    //here are the cells for SubItem 2   

    
    return cell;

所以谢谢大家! 最佳康斯坦丁

【讨论】:

【参考方案3】:

您可以使用一个 NSMuatableArray 并在其上添加引用,即

NSMuatableArray *arr=[NSMuatableArray alloc]init];

//section no 1 
[arr addObject:@"2"]; 

//section no 2 
[arr addObject:@"1"];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

   switch(arr objectAtIndex[indexPath.row])
  
   

您可以通过使用要设置单元格的引用来使用这种方式。

【讨论】:

以上是关于具有原型单元格、部分的复杂 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有多个单元格原型的 UITableView 中捕获单元格数据?

UITableView 中有多个原型单元格?

将复杂的 UITableView 转换为 UICollectionView

uitableview 中的多个原型单元,带有部分

创建具有不同单元格类型的分组 UITableview

使用具有不同单元格数的部分的 UITableView 的核心数据