在哪里构建自定义UITableViewCell:在layoutSubviews或initWithStyle中:reuseIdentifier?

时间:2013-07-31 08:03:05

标签: iphone ios objective-c ipad uitableview

据我了解,似乎有三种方法来布置自定义表格视图单元格:

  1. 在Interface Builder中。
  2. layoutSubviews
  3. initWithStyle:reuseIdentifier:
  4. 第二种和第三种方法有什么区别?另外,为什么不drawRect

    P.S。我正在阅读本书Pro iOS Table Views by Tim Duckett的第9章,我们正在构建自定义UITableViewCell。作者展示了如何以与上面相同的顺序布置单元格,但我不知道最后两个之间的差异,因为它们都消除了IB。但我注意到,作者只是在layoutSubviews中设置帧,而不是在initWithStyle:reuseIdentifier:中设置有关视图外观的属性(例如,背景图像,背景颜色等)。

2 个答案:

答案 0 :(得分:4)

您应该在

中创建单元格子视图
- initWithStyle: (UITableViewCellStyle) style reuseIdentifier: (NSString*) resueIdentifier

并在layoutSubviews中布局它们。 -initWithStyle:reuseIdentifier方法将在初始化时调用一次,但此时您的单元格框架可能不正确。

这就是为什么你需要在layoutSubviews方法中布局它,当单元格需要更新布局时调用它,例如,当自动旋转发生时。因此,如果您将在此方法中布置子视图,您将拥有有效的单元格框架和正确的子视图布局。

答案 1 :(得分:2)

-[UIView layoutSubviews]

为您提供了对视图重新布局方式的更多控制(我想在您的书籍示例中,它是在表格单元格内容中完成的)。 当您使用NIB文件时,您所做的只是在内存中重新创建具有一些属性设置的视图层次结构,但是nib没有重新布局单元格的动态功能(或者它仅限于spring / struct或自动布局功能)。如果不使用NIB,则必须以编程方式创建此层次结构。

特别是在表格视图单元子类中,您可以添加许多属性,这些属性可能会改变单元格重新布局的方式,例如显示或不显示缩略图图像,是否显示某个标签,在这种情况下,您可能需要layoutSubviews方法来更新单元格布局,同时考虑到由于不同属性值而导致的所有可能布局。