以编程方式创建 UITableViewCells

Posted

技术标签:

【中文标题】以编程方式创建 UITableViewCells【英文标题】:Creating UITableViewCells programmatically 【发布时间】:2013-09-11 18:10:01 【问题描述】:

我的 UITableViewCells 有点失控,我正在尝试更好地构建它们。问题是单元格可以具有不同的布局结构,例如标签数量、标签宽度和位置,并且可以包含不同的图像和按钮。为了只执行一次布局,我为每个配置创建了自定义 NIB,但这导致了 20 多种不同的可能布局,这些布局难以维护和调整。

我正在考虑以编程方式创建单元(完全避免情节提要原型和 NIB),并希望了解这是否是一种常见做法以及我是否应该注意性能权衡。

您对解决这种结构有何一般建议?

【问题讨论】:

主要问题是通常很难通过代码“看到”外观,而使用 nibs 自然很容易。为了使它更容易,你必须编写一个非常好的代码和/或使用方便的工具,如Three20Style lib。如果两个选项都实施得很好,您几乎不会注意到性能方​​面的差异。 【参考方案1】:

与通过 NIB 或使用多个原型单元创建 UITableViewCells 相比,通过代码创建 UITableViewCells 不会给您带来任何优势或劣势。 NIB 文件和原型单元格让您可以直观地操纵单元格布局,但它们并不禁止您在程序中额外操纵它。

所有三种构建单元的方法都有一个共同的要求 - 不同种类的单元必须具有不同的重用标识符 (see this question for a discussion)。

如果您担心的是 20 多个 NIB 文件的激增,请考虑原型单元方法,它可以让您留在单个故事板文件中。

【讨论】:

我在故事板设置中也会遇到的 20 多个 NIB 文件的主要问题是,当我想更改多个单元格之间的公共参数时,例如标签的起始位置在许多细胞中使用。如果我以编程方式完成所有操作,可能会更容易,因为我可以在子类中使用已定义的常量? @x89a2s 如果你的布局也是在 NIBs/SB 中定义的,你也可以做同样的事情:例如,你可以用相同的标签标记所有需要共享缩进的标签,然后调整这些标签的位置以编程方式使用您以符号方式定义的常量。【参考方案2】:

我解决这类问题的方法确实是切换到程序化创建,因为这样你就可以在你的 xibs 中进行子类化和实现以及相同的功能一次。例如,假设您有一个单元格,其中需要有一个红色正方形,有时您需要在红色正方形内有另一个绿色正方形。好吧,您可以拥有一个 MiddleSquareCell 基类,然后使用 GreenSquareCell 将其子类化,后者仅具有用于绘制绿色正方形的覆盖。程序化解决方案的另一个优势是配置选项。因此,例如,您可以有一个类 SquareCell,然后在创建它时有一个配置选项,上面写着

[squareCell setRedSquareVisible]; 

或者

[squareCell setRedSquareVisible]; 
[squareCell setGreenSquareVisible]; 

类似的事情。无论如何,这是实现它的一种方式。我希望这会有所帮助。

【讨论】:

【参考方案3】:

如果我明白你在说什么,那么我肯定会说程序化路线是你最好的选择!您可以在 IB 中设计自定义单元并将它们与自己的类链接起来。在该类中,您可以设置可以访问的公共属性,以便以编程方式设置它们。

下面是表格视图的典型单元格代码:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"code cell"];

    // from here you can have some if statements to determine the subclassing of that specific cell

    if ([cell isKindOfClass:[CustomCell class]]) 
        CustomCell *customCell = (CustomCell *)cell;

        customCell.label.text = @"Text";
        customCell.image = self.UIImageProperty;
     else if (//Other kind of custom cell) 

    

    return cell;

这样做可以让您轻松显示多个自定义单元格。由于您可以子类化,这将使您的生活更轻松。请记住,您需要将每个单元格的类设置为您需要的任何子类。

这样做的好处是基本的:通过编程您可以更灵活地更改单元格,并且将单元格​​子类化比创建一堆 nib 文件更简单。

【讨论】:

以上是关于以编程方式创建 UITableViewCells的主要内容,如果未能解决你的问题,请参考以下文章

无法隐藏以编程方式创建的 UIButton

Android 编程:如何以网格方式以编程方式创建各种视图类型

如何以编程方式创建“数据库创建脚本”?

如何以编程方式创建 UICollectionViewCell

dojo中以编程方式与以声明方式创建的小部件之间的区别?

以编程方式创建和显示 UIPickerView