以编程方式创建UITableViewCells

3
我的UITableViewCells有点混乱,我希望对它们进行更好的结构化管理。问题在于,这些单元格可以具有不同的布局结构,如标签数量、标签宽度和位置,还可以包含不同的图像和按钮。为了仅执行一次布局,我已经为每个配置创建了自定义NIB,但这导致了超过20种可能的布局,难以维护和调整。
我正在考虑以编程方式创建单元格(完全避免使用故事板原型和NIB),并希望了解这是否是常见做法,以及是否需要注意性能方面的权衡。
您对解决这种结构的问题有何一般性建议?

2
主要问题在于,通过代码通常更难“看到”外观,而使用 nib 则自然容易得多。为了使其更容易,您需要编写非常好的代码和/或使用方便的工具,如 Three20Style 库。就性能而言,如果两种选项都实现得很好,您几乎不会注意到差异。 - A-Live
3个回答

1
我解决这种问题的方式是采用编程创建,因为这样你可以在xib中只实现一次子类和相同功能。例如,假设您需要一个单元格,里面有一个红色的正方形,有时还需要另一个绿色的正方形在红色正方形内部。那么,你可以有一个MiddleSquareCell的基类,然后用GreenSquareCell来继承它,它只需要覆盖绘制绿色正方形的方法。编程解决方案的另一个优点是配置选项。例如,你可以有一个SquareCell类,然后在创建它时有一个配置选项,说
[squareCell setRedSquareVisible]; 

或者
[squareCell setRedSquareVisible]; 
[squareCell setGreenSquareVisible]; 

像这样的东西。无论如何,这是一种实现它的方式。我希望这有所帮助。


1
通过代码创建UITableViewCells与通过NIB或使用多个原型单元格创建它们相比,既没有优势也没有劣势。 NIB文件和原型单元格允许您在视觉上操作单元格布局,但它们不会阻止您在程序中进行其他操作。
构建单元格的所有三种方法都有一个共同的要求-不同类型的单元格必须具有不同的重用标识符({{link1:请参见此问题以进行讨论}})。
如果您担心20多个NIB文件的扩散,请考虑原型单元格方法,该方法可以让您留在单个故事板文件中。

我在处理20多个NIB文件和故事板设置时遇到的主要问题是,当我想要更改多个单元格之间的公共参数时,比如在许多单元格中使用的标签的起始位置,会出现问题。如果我全部通过编程来实现可能会更容易,因为我可以在子类之间使用已定义的常量。 - x89a10
@x89a2s 如果您的布局是在NIBs/SB中定义的,您也可以做同样的事情:例如,您可以使用相同的标记标记所有需要共享缩进的标签,然后使用您符号化定义的常量,在程序中动态调整这些标签的位置。 - Sergey Kalinichenko

0
如果我理解你的意思,那么编程路线肯定是你最好的选择!你可以在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 文件更简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接