TableViewCell常见的小问题

时间:2021-12-01 17:35:21

用TableViewCell经常遇到小问题搞到整个程序崩溃。


(1)最常见的错误:unable to dequeue a cell with identifier cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard,如下图所示:

TableViewCell常见的小问题

原因是没有在使用故事板时忘记在IB中给表格cell注册一个CellIdentifier。解决方法是在IB的cell的Identifier中填写对应的可复用标示符,如"Cell"。


(2)在重写TableViewCell类时,加载表格时却看不到任何数据。

先看看故事板:

TableViewCell常见的小问题

习惯地,我们会在故事板的表格中保留一行Prototype Cell。


再看看下面的的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
       cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
   
    //do something
    
    return cell;
}

代码中的第一句是在可复用队列中查找可复用的cell模板,所以程序首先新建故事板中以Prototype Cells模板为基础的cell,因此不会执行cell == nil下面的语句。

在程序中我们要得到的是CustomCell类的对象,但是在加载表格时表格单元呈现的是空白的Prototype Cell,而不会得到我们在CustomCell类中配置好的cell内容,所以我们会看到表格中没有任何内容。

解决方法是在故事板的表格视图中删除所有的表格单元。


(3)不使用故事板,出现如下错误:

*** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2817.7/UITableView.m:4965
2013-08-16 00:35:24.825 PurpleRuBy_Demo[19001:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
出错信息显示必须为表格单元设置一个可复用标志。

解决方法:

1.新建一个对应UITableViewCell的xib文件:

TableViewCell常见的小问题

然后在代码中加载该xib文件中的cell并注册标识:

    // 在表格视图中注册表格单元并设置可复用标识
    [self.tableView registerNib:[UINib nibWithNibName:@"TableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CellIdentifier]; // 从xib文件中加载

2.写一个UITableViewCell子类例如CustomCell,从该子类中加载并注册标识:

[self.tableView registerClass:CustomCell forCellReuseIdentifier:CellIdentifier]; // 从自定义的UITableViewCell子类中加载