2014-10-10 68 views
0

我有一个约5个不同的自定义单元格,这是故事板设计的表格视图。一个聪明的方式来配置表加载自定义单元格?

这些单元中的每一个都有其自己的专用子类UITableViewCell

cellForRowAtIndexPath,我出列的单元格:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 

现在的问题是,我想打电话给configureCell为这些细胞。我的每个自定义单元类都声明并实现了此方法,但问题是XCode抛出警报,除非我首先将这些单元转换为其各自的类,因为就XCode而言,这些单元是UITableViewCell单元。

单独铸造每种细胞类型是可行的,但是详细,有很多ifelse if行。有没有更聪明的方法来做到这一点,也许使用一个协议来声明一个方法configureCell

回答

2

确切地说,与一个协议。我认为它比子类更灵活,但它取决于每个单元类的语义,并且您始终可以混合和匹配这两种方法。

@protocol CellX 
- (void)configure:(id)data; 
@end 

@interface CellA : UITableViewCell <CellX> 
@end 

@interface CellB : UITableViewCell <CellX> 

@end 

在单元创建方法:

NSString *identifier = /* pick one for the indexPath and whatnot */ 
id<CellX> cell = (id<CellX>)[tableView dequeueReusableCellWithIdentifier:<#identifier#> 
                  forIndexPath:indexPath]; 

/* cell can be of class CellA or CellB depending on the selected identifier */ 
[cell configure:<#data#>]; 

除了可以添加到所述协议跨细胞(共享像kindstatus不管你使用任何属性等的配置方法处理细胞)。

+0

我最终这样做是因为它感觉最“正确”的解决方案,并可转移到其他类似的情况。 – 2014-10-10 13:26:41

2

提取configureCell到类BaseCell并让所有自定义单元格继承BaseCell。所以你可以

BaseCell *cell = (BaseCell *)[tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 
[cell configureCell]; 
+0

感谢您的答复调用它正确的版本。您大概建议我然后覆盖单元格子类中的-configureCell方法(因为它们每个都需要不同的实现)。但是在那种情况下,不会'[cell configureCell]'然后调用'BaseCell'中的实现? – 2014-10-10 13:06:49

+0

当然不是。它将调用每个'ChildCell'的实现,这就是所谓的多态,OO的一个原则。 – 2014-10-10 13:11:31

+0

但是在你的例子中,当你编写'[cell configureCell]'时,编译器当然不知道'BaseCell'实际上是哪个子类,那么它如何知道要使用哪个实现呢? – 2014-10-10 13:18:23

0

协议是一个很好的解决方案,但我认为有一个超类,所有这些自定义单元格视图继承是一个更好的。将“configureCell”放在超类中,并在子类中覆盖它。

MyBaseCustomTableCellView *cell =(MyBaseCustomTableCellView*) [tableView dequeueReusableCellWithIdentifier:self.cellArray[indexPath.row] forIndexPath:indexPath]; 

而且,由于“dequeueReusableCellWithIdentifier:”创建你在故事板中定义的类型的细胞,称“configureCell”应该“在子类”