尽管有标签和按钮,但可重用的UITableViewCells显示为null

时间:2014-03-11 00:23:07

标签: ios iphone objective-c uitableview

我正在使用以下代码设置表格视图:

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

        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(!cell){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        UILabel *text = [[UILabel alloc]initWithFrame:CGRectMake(10, 5, 300, 40)];
        [cell.contentView addSubview:text];
        text.tag = 1;
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    UILabel *text = (UILabel*)[cell.contentView viewWithTag:1];
    text.text = [subjects objectAtIndex:indexPath.row];
    return cell;
}

它工作正常,直到我试图在if(!cell)语句中使make cell可重用,有人知道是什么问题。 为了使细胞可重复使用,我检查了this question,我认为,正确复制了。

3 个答案:

答案 0 :(得分:1)

试试这个

-(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];
}  
for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview];
}
UILabel *text = [[UILabel alloc]initWithFrame:CGRectMake(10, 5, 300, 40)];
[cell.contentView addSubview:text];
text.backgroundColor=[UIColor redColor];
text.textColor=[UIColor blueColor];
if(subjects[indexPath.row].lenght==0)
{
text.text=@"this object is null";
}
else
{
text.text = subjects[indexPath.row];
}
return cell;
}

希望这会有所帮助

答案 1 :(得分:0)

我假设您正在混合使用故事板创建的单元格以及在if分支中以编程方式创建的单元格:

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

使用此行,您可以使用标识符UITableViewCell创建全新的CellIdentifier。在if块中,您只向该单元格的视图添加了UILabel,没有按钮等。

与此同时,我假设您已在故事板(界面构建器)中设置了具有相同标识符的原型单元格。那个单元格确实有按钮等。

但这两个是不同的细胞!以编程方式创建的单元格不知道故事板中的原型单元格。但是你给他们两个相同的重用标识符。

类比: 这就像将汽车和摩托车定义为“车辆”(=重复使用标识符)然后在创建新摩托车后想知道为什么这辆特定的车辆有只有两个轮子。 (这里的汽车相当于您在故事板中使用标签,按钮等创建的原型单元格。摩托车是您以编程方式创建的单元格。)

在这种情况下,您无需检查单元格是否为nil,因为方法dequeueReusableCellWithIdentifier:forIndexPath:总是返回有效的UITableViewCell(即如果您已在故事板中设置了具有该特定单元标识符的原型单元格。如果没有可用的可重用单元,该方法将自动创建新的单元实例。 (见this post。)

答案 2 :(得分:0)

在cellForRow中尝试:

UILabel *text = [[UILabel alloc]initWithFrame:CGRectMake(10, 5, 300, 40)];
text.backgroundColor = [UIColor blackColor];
text.textColor = [UIColor whiteColor];

然后运行查看,如果单元格textLabel显示为黑色背景,大小为(300,40),并且上面有白色文本。

如果没有黑线,则表示无法正确添加textLabel。

如果没有白色文字,则表示subjects为零或包含空字符串。