UITableView这个控件在iOS项目中几乎随处可见,甚至可以说每个应用中都有这个控件。可见此控件应用率之高。
最近在使用此控件时却遇到了一些问题,UITableView上的每个小的控件是UITableViewCell。大多数的UITableViewCell都需要自定义,这样会更灵活些,能满足我们功能上的需求。先说我的问题吧:
项目需求:一个UITableView上有两种类型的UITableViewCell。
根据项目需求这时需要自定义两种类型的UITableViewCell(这里我们称为A、B两种类型)。在我定义好了两种UITableViewCell之后在使用的时候却出现了问题:在我使用B类型对象的时候Xcode却告诉我此对象是A类型的对象,因此不能调用B类型对象的相关方法。我当时就蒙了,我明明利用B类创建的对象怎么就成了A类对象呢?代码如下:
1.if (row!=scoreModelArr.count) {
2. ScoreModel * scoreModel = [scoreModelArr objectAtIndex:row];
3. ScoreCell * cell = [ScoreCell cellWithTableView:tableView];
4. cell.scoreModel = scoreModel;
5. return cell;
6. } else{ // 最后一个单元格
7. FooterCell * cell = [FooterCell cellWithTableView:tableView];
8. cell.atlasArr = atlasArr;
9. return cell;
10. }
警告出现在第8行代码,警告此cell是ScoreCell类型,此对象没有setAtlasArr这个方法。当时我以为是Xcode的一个bug呢,最后发现还是我的问题.发现原因:我跳到了方法:[FooterCell cellWithTableView:tableView];中,发现问题出现在了这里。代码如下:
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
static NSString * cellID = @"cellID";
id cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[self alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
NSLog(@"...");
}
return cell;
}
咋一看是没有什么问题,可当我再跳到方法: [ ScoreCell cellWithTableView :tableView];中的时候发现这里代码和上面的代码完全一样,连CellID都是一样。由于UITableViewCell的唯一标识符都是一样的,让Xcode认为两种Cell都是一样的。解决:在我将CellID修改之后,此问题得到了解决。
教训:切记唯一标识符的意义。