UITableViewCell – 设置单元格的最佳位置

我一直在玩UITableViewController中的自定义单元格,它有一个基本单元(BaseCell – UITableViewCell的子类),然后是BaseCell(Sub1Cell,Sub2Cell,BaseCell的两个子类)的子类。

因为这些子类共享一些相同的function,所以如果我把它们全部设置好

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

我开始为每种细胞types重复代码。 有没有一个好的地方,是不是很好的做法,把通用的设置代码在实际的自定义UITableViewCell类中? 目前我写了一个简单的设置方法:

 - (void)setupCell { self.picture.layer.cornerRadius = 5.0f; self.picture.layer.masksToBounds = YES; self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.picture.layer.borderWidth = 1.0f; } 

一旦我创build了我的单元格,我就一直在呼吁:

 Sub1Cell *cell = [tableView dequeueReusableCellWithIdentifier:statusCellIdentifier]; [cell setupCell]; 

有没有我可以使用的方法会被自动调用? 我尝试过 – (void)prepareForReuse,但显然,它不是每次都调用,只有当单元格被重用时。

任何build议最好的方式去做这个?

编辑:

看来实际上是每次我调用tableView:cellForRowAtIndexPath被调用。 我有点困惑与创build一个自定义单元格的正确方法。 我是否应该按照以下方式做一些事情:

 Sub1Cell *cell = [tableview dequeueReusableCellWithIdentifier:cellIdentifier]; if (!cell) { cell = [[Sub1Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; [cell setupCell]; } 

如果我不通过任何风格,会影响我的自定义单元格吗?

你可以在你的单元格子类中使用awakeFromNib 。 当从故事板中的原型创build一个新的单元格时,将调用这个函数,但是当一个单元格被重新使用时,这个函数将不会被调用。

如果你正在使用原型,那么整个if(cell == nil)的东西就会消失,UITableView在dequeue方法中处理所有的东西。

在自定义单元类中,提供一个init方法来初始化。 一些代码如下:

 - (id)initWithReuseIdentifier:(NSString *)cellIdentifier { if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]) { self.picture.layer.cornerRadius = 5.0f; self.picture.layer.masksToBounds = YES; self.picture.layer.borderColor = [[UIColor lightGrayColor] CGColor]; self.picture.layer.borderWidth = 1.0f; } return self; } 

那看起来不错。 只要你只是在单元格创build时调用它,而不是在每次通过tableView:cellForRowAtIndexPath:都调用它。 不知道你在做什么样的代码。

你可以尝试把你的代码放在你的自定义单元的drawRect :看看会发生什么。 请注意,这可能会变得棘手的自定义单元格; 您可能还需要考虑自定义layoutSubviews

而且,对于这些值来说,设置这些特定的CALayer属性可能会由于离屏渲染而产生一个缓慢的效果,但是我认为这对你来说不会有什么大不了的,就好像只应该在创build单元时一样。

UPDATE

我认为你会想要从代码更新表单视图操作过程中更新单元格的内容的初始设置代码。 最初的设置代码,在我看来,就是你上面写的,只能在创build单元时运行一次。 所以我收回了上面第二段中的内容。 不要把它放在drawRect:

更多

看看苹果的文档在这里 。 我不确定传递单元格样式的效果…如果在重载initWithStyle:reuseIdentifier:你将样式传递给super,那么是的,我会认为super会使用它来设置单元格的内容视图。 如果你用自己的东西来修改内容视图,那么super就是在浪费工作。 至于你在“编辑:”下添加的其他代码,我认为它看起来不错。

对于什么是值得的,每当我这样做,我使用InterfaceBuilder。