我目前正在使用一本书学习UITableViewCell。为了在滚动时重用单元,作者要求修改原始代码以包括if()
语句以检查特定重用标识符的单元是否存在。但是,在添加if()
语句后,Xcode会在Unused variable 'cell'
内的行上发出警告if(!cell)
。运行代码时,我收到错误Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
出了什么问题?
原始代码
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"UITableViewCell"] autorelease];
Possession *p = [[[PossessionStore defaultStore] allPossessions] objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];
return cell;
}
修改后的代码
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Check for reusable cell first, use that if it exists
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
// If there is no reusable cell of this type, create a new one
if (!cell) {
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"UITableViewCell"] autorelease];
}
Possession *p = [[[PossessionStore defaultStore] allPossessions] objectAtIndex:[indexPath row]];
[[cell textLabel] setText:[p description]];
return cell;
}
答案 0 :(得分:6)
我认为你必须将UITableViewCell *
放在条件块中。否则,您将在块中声明一个新的cell
变量并将其丢弃而不是分配给上面声明的单元格。 (编译器没有警告过你吗?)整体逻辑应该是:
UITableViewCell *cell = /* try to get a cached one */
if (cell == nil) {
cell = /* there was no cached cell available, create a fresh one */
}
/* …more code… */
/* and finally return the created cell */
return cell;