如何创建具有多种单元格类型的分组表视图?

Posted

技术标签:

【中文标题】如何创建具有多种单元格类型的分组表视图?【英文标题】:How to create a grouped table view with multiple cell types? 【发布时间】:2013-04-02 14:00:59 【问题描述】:

我没有使用故事板,它是 ios 6。

当所有单元格都是相同类型时,我知道该怎么做,但我需要一个包含多种单元格类型的分组表视图。举个例子,假设第一个单元格需要是UITableViewCellStyleValue1,第二个单元格需要是UITableViewCellStyleSubtitle,第三个单元格是自定义单元格(UITableViewCell 子类,它有一个 xib,因此可以使用与registerNib:forCellReuseIdentifier:

主要是我不确定构建tableView:cellForRowAtIndexPath: 的最佳方式。但我不确定是否应该注册自定义单元格或全部。

最好的方法是什么?

【问题讨论】:

我猜这是一个可变长度表,而静态表不能满足您的需求?您提到有一个单独的 XIB 文件用于自定义单元格布局。您可以在与表格相同的 XIB 中创建自定义单元格,并在那里设置重用标识符。它更容易并且适用于许多情况。你有什么不适合你的特殊情况吗? @DBD 我已经编辑了问题以表明它是静态的。我不认为我在为自定义单元格设置重用标识符的位置而苦苦挣扎,但如果这是解决方案,请详细说明。 @DBD 另外,我在许多其他地方都在使用该自定义单元格,因此最好有自己的 xib 文件。如果我错了,请纠正我。 【参考方案1】:

你走在正确的道路上。由于您的自定义单元格正在其他地方使用,因此 xib 是加载它的好地方。至于实现,你可以做这样的事情。

假设您的表格视图是“静态的”并且有三个单元格,您可以在 viewDidLoad 中注册您的自定义笔尖:

- (void)viewDidLoad

    [super viewDidLoad];

    UINib *customCellNib = [UINib nibWithNibName:@"CustomCell" bundle:nil];
    [self.tableView registerNib:customCellNib forCellReuseIdentifier:@"CustomIdentifier"]

然后在cellForRowAtIndexPath:

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

    UITableViewCell *cell = nil;

    if(indexPath.row == 0) 

        cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier1"];

        if(cell == nil) 

            cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleValue1
                                           reuseIdentifier:@"CellIdentifier1"];
        
    
    /* Cell 2 ommited for brevity */
    else if(indexPath.row == 2) 

        //Just to demonstrate the tableview is returning the correct type of cell from the XIB
        CustomCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"CustomIdentifier"];
        cell = customCell;
    

    [self configureCell:cell atIndexPath:indexPath];

    return cell;

最后在 IB 中为 Xib 设置正确的Identifier 为单元格。

更新

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

    if(indexPath.row == 0) 
        cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];
    
    else 

        //custom cell here
        //cell.textfield.text = @"blah blah";
    

配置单元格方法在某种程度上是用于主要使用NSFetchedResultsController(及其使用的delegate)放置的表格视图单元格的约定

这只是用适当的内容重置重复使用的单元格的一种便捷方法,并使cellForRowAtIndexPath: 更易于阅读。我什至制作了多个版本的 configureCell,例如 configureCustomCell1:atIndexPath,以进一步提高可读性。

希望这会有所帮助!

【讨论】:

是的,很有帮助!在xib中为自定义单元格设置Identifier有什么好处? 您能否也显示configureCell:atIndexPath: 的代码?我假设它的方法签名是这样的:- (UITableViewCell *)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath。一旦进入那里,CustomCell 怎么知道它是 CustomCell?使用演员表?这样做的最佳方式/地点是什么? 其实很有趣的问题,为什么要在 IB 中设置 Identifier?据我所知,在这种情况下您不需要这样做,因为您使用的是registerNib:forCellReuseIdentifier:。 tablview 在没有设置标识符的情况下正确地重用这些单元格。如果您使用其他各种较旧的方法之一从 xib 中提取单元格,您可能需要设置它。我很快就会用 configureCell 实现更新我的答案。 我必须在 configureCell:atIndexPath:if (indexPath.section == sectionWithCustomCells) CustomCell *customCell = (CustomCell *)cell; ...【参考方案2】:

如果您使用的是静态表,则不需要重用标识符或其他任何东西,因为不会再使用任何单元格。只需将表格设置为“分组”样式的“静态单元格”并设置所需的部分数。您可以单击“表格视图部分”并设置该部分中的行数(并设置您可能需要的任何页眉/页脚)。

然后根据需要配置单元格。您可以选择默认单元格或将单元格设为“自定义”并从对象库中拖动 UI 组件。您可以为静态表格单元格中的组件设置IBOutletsIBActions,就像在普通视图中设置组件一样。

【讨论】:

我没有看到 Content: Static CellsSections: 我没有使用 Storyboard。这有区别吗? 但是我可以为这个表格视图使用故事板吗? 要创建静态表,您需要使用情节提要。您可以轻松地创建一个包含单个视图控制器的故事板,但您不能在故事板中创建一个没有视图控制器的视图。 感谢您的努力,但我不愿意接受答案,因为我希望有人可以解释如何仅使用 xibs 来做到这一点。 这丝毫不影响我。遗憾的是,XIB 不支持静态表格视图。您可以创建一个带有“视图”的 XIB,即您的 UITableView 和更多视图,即您的 UITableViewCells,并使用标准重用系统将它们全部加载(即使没有真正被重用)。

以上是关于如何创建具有多种单元格类型的分组表视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS中的表视图底部创建固定单元格?

分组表视图中单元格的索引路径

表格视图中的分组单元格在下一节标题之前具有半透明区域/填充。我该如何改变呢?

如何使用来自另一个视图控制器swift的用户输入创建具有表视图单元格的列表

SWIFT:在具有多个部分的表视图中显示字典时,无法将具有标识符单元格错误的单元格出列

如何更改分组的表格视图单元格的背景?