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

Posted

技术标签:

【中文标题】创建具有不同单元格类型的分组 UITableview【英文标题】:Creating Grouped UITableview with Different Cell Types 【发布时间】:2012-06-25 20:21:07 【问题描述】:

我需要创建一个分组的 uitableview,其中包括一些部分,并且每个部分中可能包含不同的单元格类型。

我正在尝试创建类似旧的foursquare 应用程序、用户页面(包括“排行榜”、“朋友建议”、“朋友”、“统计”、“最常探索的类别”......部分)。

我对 ios 编程相当陌生,因此该视图可能不是分组的 uitableview。

我特别坚持的是为部分创建不同的单元格,并找出点击了哪些单元格。

我的数据源将是 2 个不同的 NSArray*,它们由不同的数据类型组成,这就是为什么我需要不同的自定义单元格。

【问题讨论】:

【参考方案1】:

由于您有两组不同的数据,并且需要在不同的部分中显示,因此您必须将数据源方法一分为二。

基本上,选择您想首先成为的数据集然后就可以了。

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

    if(section)return secondArray.count;
    //Essentially, if statements evaluate TRUE and move forward if the inside is 1 or greater (TRUE == 1)
    return firstArray.count;
    //If the first if statement return hits, then the code will never reach this statement which turns this into a lighter if else statement


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

    if(indexPath.section)
    
        //do stuff with second array and choose cell type x
    
    else
    
        //do stuff with first array and choose cell type y
    


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    //Get the cell with: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if(indexPath.section)
    
        //perform action for second dataset
    
    else
    
        //perform action for first dataset
    

对于标题,您可以使用这些方法中的任何一种,并保持与上述相同的样式类型:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;

【讨论】:

欢迎询问我。 我认为您应该澄清 if 语句中的 indexPath.section 和 section 应该与 0 和 1 进行比较。哦,让“if(section)return secondArray.count; return firstArray.count;if(section = 0)return firstArray.count elsereturn secondArray.count 感谢@RileyE。除了为每个部分设置标题外,现在已经很清楚了。如果您知道,您能否在您的答案中也添加该信息? 感谢@ipwnstuff,帮助我理解部分/计数的事情。 这样效果更好吗?我试图解释,而不是改变。【参考方案2】:

您可以创建多个 UITableViewCell 的自定义子类,并且在您的 UITableViewDataSource 的 tableView:cellForRowAtIndexPath: 方法中,您可以使用 if 语句来确定要使用的单元格类型。

例如,以下是我可能会做的粗略概述:

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

    //First, determine what type of object we're showing
    if (indexPath.section == 0) 
         //Create and return this cell.
     else if (indexPath.section == 1) 
         //Create and return this cell.
    ...

下面是你如何实现numberOfRowsInSection

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

   if (section == 0) 
      return [firstSectionArray count];
    else if (section == 1) 
      return [secondSectionArray count];
    ...

对于didSelectRowAtIndexPath

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
   if (indexPath.section == 0) 
      ObjectSelected *objectSelected = [firstArray objectAtIndex:indexPath.row];

      //Now you've got the object, so push a view controller:
      DetailViewController *dvc = [[DetailViewController alloc] init];
      dvc.objectSelected = objectSelected;
      [self.navigationController pushViewController:dvc];
    else if (indexPath.section == 1) 
      //Same thing, just call [secondArray objectAtIndex:indexPath.row] instead!
   

【讨论】:

感谢您的回答。好的,这是有道理的,但是我怎样才能在这个方法中获取项目,我有 2 个不同的数组但是这个方法只给出索引?以及如何通过您的方法实现 numberOfRowsInSection 和 didSelectRowAtIndexPath 方法? 我认为你的问题没有说得很清楚。你到底想做什么,这个答案有什么问题?这正是创建不同类型的单元格所需要做的。 @RileyE 是的,我想你是对的。正如我在评论中所说,这可能会解决放置不同类型的单元格的问题,但我仍然不知道如何理解单击了哪个单元格,以及如何将数据传递给其单击操作。我希望现在清楚了吗? 是的。那更好。您将在 didSelectRow 方法中获得 indexPath,然后您只需执行与之前对数组所做的相同类型的检查,以确定它是什么类型。 非常感谢@RileyE。最后一个问题,如果这不是太多。如何使用 2 个不同的 NSArray 设置 TableView 的数据源?

以上是关于创建具有不同单元格类型的分组 UITableview的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 样式分组中设置单元格的角半径?

具有不同单元格类型和高度的 UITableView

使用具有不同模型和 DataTemplates 的分组 ListView

Swift 中具有/不同单元格类型的可重用数据源

每个部分具有不同单元格的 SwiftUI 列表

对具有相同 zoneID 的相邻单元格进行分组,MATLAB