我一直在UITableViewController中使用自定义单元格,有一个基本单元(BaseCell - UITableViewCell的子类),然后是BaseCell的子类(Sub1Cell,Sub2Cell,BaseCell的两个子类)。
因为子类共享一些相同的功能,如果我在
中完全设置它们- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
我开始为每种细胞类型重复代码。将通用设置代码放在实际的自定义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;
}
一旦我创建了我的单元格,我就一直在调用它:
Sub1Cell *cell = [tableView dequeueReusableCellWithIdentifier:statusCellIdentifier];
[cell setupCell];
我可以使用自动调用的方法吗?我试过 - (void)prepareForReuse但显然,它并不是每次调用,只有在重用单元格时才会被调用。
关于最佳方法的任何建议?
修改
每次拨打tableView:cellForRowAtIndexPath
时,似乎都会调用它。我对创建自定义单元格的正确方法感到困惑。我应该按照以下方式做点什么:
Sub1Cell *cell = [tableview dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
cell = [[Sub1Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
[cell setupCell];
}
如果我没有对传递的样式做任何事情,它会影响我的自定义单元吗?
答案 0 :(得分:15)
您可以在单元格子类中使用awakeFromNib
。当从故事板中的原型创建新单元格时,将调用此方法,但在重新使用单元格时则不会。
如果你正在使用原型,那么整个if(cell == nil)就会消失,UITableView会在dequeue方法中为你处理所有这些。
答案 1 :(得分:1)
在自定义单元类中,提供初始化的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;
}
答案 2 :(得分:0)
看起来不错。只要您只在创建单元格时调用它,而不是在每次通过tableView:cellForRowAtIndexPath:
时调用它。不确定你从示例代码中做了什么。
您可能会尝试将代码放入自定义单元格drawRect
中:看看会发生什么。请注意,这可能会使自定义单元格棘手;您可能还需要考虑自定义layoutSubviews
。
另外,对于它的价值,设置这些特定的CALayer属性可能会因为屏幕外渲染而产生减速效果,但我认为这对你来说不是什么大问题,好像应该只在创建单元格时发生。 / p>
更新
我认为您希望将初始设置代码与在表视图操作期间更新单元格内容的代码分开。初始设置代码,在我看来就是你上面所写的,只能在创建单元格时运行一次。所以我收回了我在上面第2段所写的内容;不要把它放在drawRect:
。
更多
查看Apple的文档here。我不确定传递单元格样式的效果...如果你在覆盖initWithStyle:reuseIdentifier:
时将样式传递给super,那么是的,我认为super会使用它来设置单元格的内容视图。如果你随后用你自己的东西修改内容视图,那么super就是浪费了工作。至于你在“编辑:”下添加的其余代码,我觉得它看起来不错。
对于它的价值,每当我这样做时,我都使用InterfaceBuilder。