在我的cellForRowAtIndexPath
方法中,我使用以下if语句:
if ([taskitem.isCritical isEqualToString:@"iscritical"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor redColor];
}
else if ([taskitem.isUrgent isEqualToString:@"isurgent"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor blueColor];
}
else if ([taskitem.isCompletedOK isEqualToString:@"iscompleted"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor greenColor];
UIButton *doneButton4 = [[UIButton alloc]initWithFrame:CGRectMake(0, 10, 12, 12)];
[doneButton4 setImage:[UIImage imageNamed:@"done"]forState:UIControlStateNormal];
[cell addSubview:doneButton4];
}
else {
cell.textLabel.textColor = [UIColor blackColor];
}
cell.textLabel.text = taskitem.taskName;
问题是如果用户点击任何部分标题,if statements
正在改变他们的行为。
您是否在我的代码中发现任何可能导致这种奇怪行为的错误,或者我应该在其他方法中搜索其他原因?
答案 0 :(得分:0)
看起来你可能有一个细胞重用问题。您需要确保在一个案例中执行的任何操作都针对每个案例(或撤消)进行。
例如,在您的三个条件中,首先设置文本颜色和背景颜色。但在第四种情况下(其他),您只需设置文本颜色,使背景颜色保持为上次使用时在此单元格上的颜色。您还需要在else情况下设置背景颜色。 (可选)您可以在if之前将所有项目设置回默认值。
这里有第二个问题,第三种情况是创建并向单元格添加一个按钮。但在其他情况下,如果存在,则不删除该按钮。因此,当您获得之前用于完成项目的单元格时,您最终会得到一个不属于该按钮的按钮。即使单元格用于另一个已完成的项目,您也会在同一个单元格上获得两个按钮。一个在另一个之上(所以它可能不会被看到,但它仍然是一个问题)。
尝试使用此代码:
UIButton* oldButton = [cell viewWithTag:253];
if (oldButton)
{
[oldButton removeFromSuperview];
}
if ([taskitem.isCritical isEqualToString:@"iscritical"]) {
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor redColor];
}
else if ([taskitem.isUrgent isEqualToString:@"isurgent"]) {
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor blueColor];
}
else if ([taskitem.isCompletedOK isEqualToString:@"iscompleted"]) {
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor greenColor];
UIButton *doneButton4 = [[UIButton alloc] initWithFrame:CGRectMake(0, 10, 12, 12)];
[doneButton4 setImage:[UIImage imageNamed:@"done"] forState:UIControlStateNormal];
doneButton4.tag = 253;
[cell addSubview:doneButton4];
}
else {
cell.textLabel.textColor = [UIColor blackColor];
cell.textLabel.backgroundColor = [UIColor whiteColor];
}
cell.textLabel.text = taskitem.taskName;
我不建议在生产代码中使用这样的标签,但这是一种快速查看它是否能解决您的问题的方法。在实际代码中,使用UITableViewCell子类,其中包含可以显示和隐藏的完成按钮的属性。理想情况下,您每次都不会创建它,因为这是一项昂贵的操作,并且可能会降低滚动性能。
答案 1 :(得分:0)
在表视图中重用单元格时,在(cell == nil)中创建doneButton4
- (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];
UIButton *doneButton4 = [[UIButton alloc]initWithFrame:CGRectMake(0, 10, 12, 12)];
[doneButton4 setImage:[UIImage imageNamed:@"done"]forState:UIControlStateNormal];
[cell addSubview:doneButton4];
doneButton4.tag=100;
}
UIButton *doneButton4=(UIButton*)[cell viewWithTag:100];
doneButton4.hidden=YES;
if ([taskitem.isCritical isEqualToString:@"iscritical"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor redColor];
}
else if ([taskitem.isCritical isEqualToString:@"isurgent"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor blueColor];
}
else if ([taskitem.isCritical isEqualToString:@"iscompleted"]){
cell.textLabel.textColor = [UIColor whiteColor];
cell.textLabel.backgroundColor = [UIColor greenColor];
doneButton4.hidden=NO;
}
else {
cell.textLabel.textColor = [UIColor blackColor];
}
cell.textLabel.text = taskitem.taskName;
}