objective-c:[self.tableview reloadData]重新加载数据但不清除旧单元格

时间:2011-02-08 16:27:14

标签: objective-c uitableview reloaddata reuseidentifier

我正在研究tableview,我是动态创建单元格的新手(我曾经用IB创建它们,然后将它们链接到它们的tableviewcell控制器等等。)。

一切都很好,并且可以正确更新数组,但是当我触发[self.tableview reloadData]时,程序只是在旧单元格上重新绘制新值。例如,如果在单元格内的uilabel中有“TEST CELL”值,当我将数据更新为“CELL TEST”并激活reloadData时,uilabel看起来有两个标签在彼此的顶部,并且两个值都是可见的。 (就像创建两个具有完全相同位置和相同大小并设置其值的uilabel一样)

并且每当我发起reloadData时都会发生这个事件,每次重新加载时,程序看起来像是在旧版本之上添加另一个uilabel。继承我的代码:

- (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];
}
UILabel *lblText1 = [[UILabel alloc] initWithFrame:CGRectMake(30, 5, 130, 30)];
lblText1.adjustsFontSizeToFitWidth = YES;
lblText1.backgroundColor = [UIColor clearColor];
lblText1.text = [lblText1Array objectAtIndex:indexPath.row];
[cell addSubview:lblText1];
[lblText1 release];
if(indexPath.row<3)
{   
    UILabel *lblText2 = [[UILabel alloc] initWithFrame:CGRectMake(170, 5, 130, 30)];
    lblText2.adjustsFontSizeToFitWidth = YES;
    lblText2.backgroundColor = [UIColor clearColor];
    lblText2.text = nil;
    lblText2.text = [spParameters objectAtIndex:indexPath.row];
    [cell addSubview:lblText2];
    [lblText2 release];
}
else if(indexPath.row==3){
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(170, 7, 130, 30)];
    textField.adjustsFontSizeToFitWidth = YES;
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.placeholder = @"please insert value";
    textField.textAlignment = UITextAlignmentCenter;
    textField.delegate = self;
    textField.text = [spParameters objectAtIndex:indexPath.row];
    [cell addSubview:textField];
    [textField release];
}
else if(indexPath.row == 4)
{
    UISwitch *gSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(170, 7, 130, 30)];
    [gSwitch setOn:FALSE];
    [gSwitch addTarget: self action: @selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged];
    [cell addSubview:gSwitch];
    [gSwitch release];
}
// Configure the cell...
return cell;

}

我将组件添加到子视图后释放组件,我正在考虑是否有重复的标识符错误......

Thanx帮忙。

1 个答案:

答案 0 :(得分:1)

看起来您正在使用固定数量的单元格填充详细信息视图,因此您应该考虑静态创建实例,例如在viewDidLoad或Interface Builder中。您可以将每个单元格存储在单独的实例变量中,并在每次调用tableView:cellForRowAtIndexPath:时返回与当前行对应的那个。

如果以编程方式创建单元格,请添加当时所需的子视图。否则,正如我所提到的,您可以在Interface Builder中执行此操作,这通常可以更轻松地设置控件(如文本字段)的详细信息。请注意UITableViewCell已经包含UILabel的实例,因此自己添加一个实例是多余的。相反,只需访问单元格的textLabel属性即可获得其标签。