UITableView有关cellForRowAtIndexPath的问题

时间:2009-12-29 02:33:24

标签: iphone cocoa-touch uitableview

我正在尝试用多个部分填充uitableview。 这是我的代码:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

case 1:
[[cell textLabel] setText:[usersTeachers objectAtIndex:(indexPath.row+1)]];
return cell;
break;

尝试加载视图时出现此错误:

2009-12-28 21:09:48.380 FSS[2046:207] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-984.38/UITableView.m:4709
2009-12-28 21:09:48.381 FSS[2046:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

该索引处的数组记录为合法字符串,但它不会正确返回单元格。因此它不会超过这一点。请帮忙。

6 个答案:

答案 0 :(得分:28)

在我看来,你有一个部分可见的开关案例,它正在为案例1返回一个单元格。 您的错误让我觉得您在切换案例中返回了一个null UITableViewCell某个分支。

确保该开关案例外的所有路径都返回有效的UITableViewCell对象。

你对案件0有什么回报?换句话说,你为UITableView请求的第一行返回了什么?

以下是我的某个项目的代码示例,它可能为您提供一个很好的起点,让您了解出错的地方:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSInteger section = [indexPath section];

    switch (section) {
        case 0: // First cell in section 1
            cell.textLabel.text = [collectionHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 1: // Second cell in section 1
            cell.textLabel.text = [noteHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 2: // Third cell in section 1
            cell.textLabel.text = [checklistHelpTitles objectAtIndex:[indexPath row]];
            break;
        case 3: // Fourth cell in section 1
            cell.textLabel.text = [photoHelpTitles objectAtIndex:[indexPath row]];
            break;
        default:
            // Do something else here if a cell other than 1,2,3 or 4 is requested
            break;
    }
    return cell;
}

答案 1 :(得分:2)

不确定为什么你有“案例1:”独自坐在那里,但如果它是一个除了1以外的情况,这将会失败,并且在此之后的任何事情将被退回。确保你总是返回一个牢房。

答案 2 :(得分:2)

你可能没有为indexPath.row == 0返回一个单元格(你的'case 1'是可疑的......)。但不能说除非你发布整个switch语句。

尝试在switch语句之外返回'cell',你会更好地理解会发生什么。那么你就不会有断言失败。

答案 3 :(得分:2)

检查你有没有

if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

in

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

答案 4 :(得分:2)

好的,如果此问题的所有其他解决方案都不起作用,请确保表格视图的单元格(在故事板中)的单元格标识符与您在tableviewdelegate代码中使用的单元格标识符匹配:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    static NSString *CellIdentifier = @"CustomCell";

故事板中的单元格标识符必须是“CustomCell”才能匹配此代码。

答案 5 :(得分:-3)

在我的情况下,我遇到了同样的错误,因为我错过了alloc / init:

if (cell == nil) {
        cell = [[UITableViewCell alloc] init];

}