iOS: UItableview 在 dequeueReusableCellWithIdentifier 上重复值
iOS: UItableview repeat values on dequeueReusableCellWithIdentifier
我的单元格中有一个编辑文本,当我向上或向下滚动时,它将第一个单元格值设置为最后一个单元格和倒数第二个单元格。我认为这是因为它使单元格出列但我无法解决这个问题。这是我的单元格代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
_myTableView = tableView;
AddTaskTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"addTaskCell" forIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
AddTaskDetails *task =[self.tasksArray objectAtIndex:indexPath.row];
cell.addHours.delegate = self;
cell.taskDetails.text =task.taskName;
_hoursTextField = cell.addHours;
_hoursTextField.delegate = self;
cell.addHours.tag = indexPath.row;
cell.addDescriptionBtn.tag = indexPath.row;
[cell.addDescriptionBtn addTarget:self action:@selector(didTapAddDescButton:) forControlEvents:UIControlEventTouchUpInside];
[cell.addHours addTarget:self action:@selector(editStart:) forControlEvents:UIControlEventEditingDidBegin];
[cell.addHours addTarget:self action:@selector(editEnd:) forControlEvents:UIControlEventEditingDidEnd];
[cell.addHours addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
if(task.isTextRed)
{
cell.taskDetails.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0];
cell.addHours.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0];
}
else
{
cell.taskDetails.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
cell.addHours.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
}
if(task.isBillable)
{
cell.backgroundColor = [UIColor whiteColor];
}
else
{
cell.backgroundColor = [UIColor lightGrayColor];
}
AddTaskDetails *task_1 =[self.tasksArray objectAtIndex:indexPath.row];
if(task_1.hours>0)
{
NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours];
cell.addHours.text = hours;
}
else
{
cell.addHours.placeholder = @"0";
}
NSString *hours = [[NSString alloc]initWithFormat:@"Total Hours: %ld",_totalHours];
if(_totalHours<=24)
{
_labelTotalHours.text = hours;
}
return cell;
}
此屏幕截图具有正确的值:
图中4是自动分配的错误值,这个值也不是数组。
只是一个简短的概述,所以你得到你的答案
UITableView 经过高度优化,因此只在内存中保留屏幕上可见的行。现在,所有行 Cells 都缓存在 Pool 中,并被重用而不是重新生成。每当用户滚动 UITableView 时,它都会在 Pool 中添加刚刚隐藏的行,并将它们重新用于下一个可见行。
所以,现在,来回答你的问题
在您的方法 cellForRowAtIndexPath 中 --
始终重置每个索引的值:
例如。如果您的单元格中有 UILabel - 标签,则在 cellForRowAtIndexPath 中设置它时,您需要为每个条件设置所需的值。如果你想让它为空,那么将它设置为“”
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if(today){
label = "today";
}
else if(yesterday){
label = "yesterday";
}
else{
label = ""; **//this is important**
}
return cell;
}
你的代码有问题
if(task_1.hours>0)
{
NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours];
cell.addHours.text = hours;
}
else
{
cell.addHours.text = ""; // YOU NEED TO SET TEXT TO EMPTY AS WELL
cell.addHours.placeholder = @"0";
}
After Declate cell you put below code `if(cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
else
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell.contentView clearsContextBeforeDrawing];`
我的单元格中有一个编辑文本,当我向上或向下滚动时,它将第一个单元格值设置为最后一个单元格和倒数第二个单元格。我认为这是因为它使单元格出列但我无法解决这个问题。这是我的单元格代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
_myTableView = tableView;
AddTaskTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"addTaskCell" forIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
AddTaskDetails *task =[self.tasksArray objectAtIndex:indexPath.row];
cell.addHours.delegate = self;
cell.taskDetails.text =task.taskName;
_hoursTextField = cell.addHours;
_hoursTextField.delegate = self;
cell.addHours.tag = indexPath.row;
cell.addDescriptionBtn.tag = indexPath.row;
[cell.addDescriptionBtn addTarget:self action:@selector(didTapAddDescButton:) forControlEvents:UIControlEventTouchUpInside];
[cell.addHours addTarget:self action:@selector(editStart:) forControlEvents:UIControlEventEditingDidBegin];
[cell.addHours addTarget:self action:@selector(editEnd:) forControlEvents:UIControlEventEditingDidEnd];
[cell.addHours addTarget:self
action:@selector(textFieldDidChange:)
forControlEvents:UIControlEventEditingChanged];
if(task.isTextRed)
{
cell.taskDetails.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0];
cell.addHours.textColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1.0];
}
else
{
cell.taskDetails.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
cell.addHours.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
}
if(task.isBillable)
{
cell.backgroundColor = [UIColor whiteColor];
}
else
{
cell.backgroundColor = [UIColor lightGrayColor];
}
AddTaskDetails *task_1 =[self.tasksArray objectAtIndex:indexPath.row];
if(task_1.hours>0)
{
NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours];
cell.addHours.text = hours;
}
else
{
cell.addHours.placeholder = @"0";
}
NSString *hours = [[NSString alloc]initWithFormat:@"Total Hours: %ld",_totalHours];
if(_totalHours<=24)
{
_labelTotalHours.text = hours;
}
return cell;
}
此屏幕截图具有正确的值:
图中4是自动分配的错误值,这个值也不是数组。
只是一个简短的概述,所以你得到你的答案
UITableView 经过高度优化,因此只在内存中保留屏幕上可见的行。现在,所有行 Cells 都缓存在 Pool 中,并被重用而不是重新生成。每当用户滚动 UITableView 时,它都会在 Pool 中添加刚刚隐藏的行,并将它们重新用于下一个可见行。
所以,现在,来回答你的问题
在您的方法 cellForRowAtIndexPath 中 --
始终重置每个索引的值:
例如。如果您的单元格中有 UILabel - 标签,则在 cellForRowAtIndexPath 中设置它时,您需要为每个条件设置所需的值。如果你想让它为空,那么将它设置为“”
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if(today){
label = "today";
}
else if(yesterday){
label = "yesterday";
}
else{
label = ""; **//this is important**
}
return cell;
}
你的代码有问题
if(task_1.hours>0)
{
NSString *hours = [[NSString alloc]initWithFormat:@"%d",task_1.hours];
cell.addHours.text = hours;
}
else
{
cell.addHours.text = ""; // YOU NEED TO SET TEXT TO EMPTY AS WELL
cell.addHours.placeholder = @"0";
}
After Declate cell you put below code `if(cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
else
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:MyIdentifier] autorelease];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell.contentView clearsContextBeforeDrawing];`