用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,如下图所示:
原因是没有在使用故事板时忘记在IB中给表格cell注册一个CellIdentifier。解决方法是在IB的cell的Identifier中填写对应的可复用标示符,如"Cell"。
(2)在重写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文件:
然后在代码中加载该xib文件中的cell并注册标识:
// 在表格视图中注册表格单元并设置可复用标识 [self.tableView registerNib:[UINib nibWithNibName:@"TableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CellIdentifier]; // 从xib文件中加载
2.写一个UITableViewCell子类例如CustomCell,从该子类中加载并注册标识:
[self.tableView registerClass:CustomCell forCellReuseIdentifier:CellIdentifier]; // 从自定义的UITableViewCell子类中加载