我正在研究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帮忙。
答案 0 :(得分:1)
看起来您正在使用固定数量的单元格填充详细信息视图,因此您应该考虑静态创建实例,例如在viewDidLoad
或Interface Builder中。您可以将每个单元格存储在单独的实例变量中,并在每次调用tableView:cellForRowAtIndexPath:
时返回与当前行对应的那个。
如果以编程方式创建单元格,请添加当时所需的子视图。否则,正如我所提到的,您可以在Interface Builder中执行此操作,这通常可以更轻松地设置控件(如文本字段)的详细信息。请注意UITableViewCell
已经包含UILabel
的实例,因此自己添加一个实例是多余的。相反,只需访问单元格的textLabel
属性即可获得其标签。