如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?

Posted

技术标签:

【中文标题】如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?【英文标题】:How do I have a UITableView with two different cell types and set each of the`cell layouts up programmatically, instead of via a Storyboard? 【发布时间】:2013-04-14 03:17:43 【问题描述】:

之前我使用故事板进行了此设置,已拖动 UILabel,将它们定位并调整它们的大小,而不是在我将它们拖动到的 UITableViewCell 上,然后为另一个 UITableViewCell 执行不同的版本。

例如,如下所示(但在图片中它们尚未使用标签进行自定义):

然后在数据源中,我只需检查标识符,并根据标识符是什么,相应地自定义单元格。

但是,我需要比从情节提要中获得更多的定制,因为每个单元格将有两个 UIView(一个顶部和一个底部以允许滑动顶部)所以我真的不能使用情节提要执行此操作,因为我以编程方式将标签和所有内容添加到 UIView。

但我的问题是:当我以编程方式执行此操作时,如何判断哪个单元格是哪个单元格,以便我可以相应地自定义 UILabel 的布局?使用情节提要,我显然可以将 UILabel 拖到每个上,但是当以编程方式执行此操作并设置 UIView 时,我不知道怎么说,“嘿,如果标识符是这个,请像这样添加 UILabel”,因为UIViews 不知道任何标识符。

基本上结构是这样的:

UITableView -> UITableViewCell -> CellFront(UIView) & CellBack(UIView)

单元格的外观来自于添加到 CellFront UIView 的标签。但是单元格有两种外观,如果没有故事板,我不知道该怎么做。

【问题讨论】:

【参考方案1】:

虽然UIViews 不知道标识符,但它们有一个名为tag 的属性,可用于您想要的任何目的。您可以将标记设置为,例如,在一种单元格上设置为1,在另一种单元格上设置为2,然后使用标记来区分代码中的单元格。此外,一旦您的视图被标记,您可以在包含视图上调用viewWithTag:,并使用您想要的tag 取回视图。

【讨论】:

【参考方案2】:

如果您仅在代码中创建单元格,那么您在表格视图控制器的 viewDidLoad 方法中注册您的 UITableViewCell 子类。该方法设置标识符。然后,您在 cellForRowAtIndexPath: 中使用该标识符:就像您为 xib 或情节提要创建的单元格一样。

[self.tableView registerClass:[MyCellSubclass class] forCellReuseIdentifier:@"MyIdentifier"];

【讨论】:

【参考方案3】:

这是一种方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    // Adjust the condition to match your needs
    if (indexPath.row == 0) 
        static NSString *Identifier1 = @"CellType1";
        // cell type 1
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier1];
        if (cell == nil) 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier1];

            // add subviews here
        

        // set cell properties

        return cell;
     else 
        static NSString *Identifier1 = @"CellType2";
        // cell type 2
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier2];
        if (cell == nil) 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier2];

            // add subviews here
        

        // set cell properties

        return cell;
    

【讨论】:

以上是关于如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 中拥有具有不同单元格高度的网格布局组件

如果我有两种不同类型的单元格,如何使用 FetchedResultsController?

使用两种不同类型的单元格时如何确定集合视图的大小

根据数据类型,具有不同类型单元格的 Jtable

在具有动态高度的 IB uitableviewcell 中使用带有 XIB 的自定义视图

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