我的表格视图中有一个非常奇怪的问题 我在表格视图中使用不同的部分,每个部分都有不同的行数。我在表格视图的单元格中有一些文本字段。问题是,当我向下滚动表视图时,第一部分的文本字段的第一个单元格和最后一部分的第一行文本字段相互重叠。当我向上滚动表格视图时会发生同样的事情。
static NSString *cellIdetifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdetifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdetifier];
}
cell.detailTextLabel.textColor = [UIColor blackColor];
if(indexPath.section == 0)
{
if(indexPath.row == 0)
{
titleAdded = 1;
self.nameView.backgroundColor = [UIColor clearColor];
self.eventName.textColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];
[cell addSubview:self.nameView];
}
else if (indexPath.row == 1)
{
NSLog(@"in section 0");
self.locationView.backgroundColor = [UIColor clearColor];
self.locationField.textColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];
[cell addSubview:self.locationView];
}
}
else if (indexPath.section == 1)
{
if(indexPath.row == 0)
{
cell.textLabel.text = NSLocalizedString(@"Starts", @"");
if(self.selectedDate != nil)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//[formatter setDateFormat:@"yyyy-mm-dd"];
[formatter setDateStyle:NSDateFormatterFullStyle];
NSString *stringFromDate = [formatter stringFromDate:self.selectedDate];
cell.detailTextLabel.text = stringFromDate;
}
}
else if(indexPath.row == 1)
{
cell.textLabel.text = NSLocalizedString(@"Ends", @"");
if(self.selectedDate != nil)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//[formatter setDateFormat:@"yyyy-mm-dd"];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *stringFromDate = [formatter stringFromDate:self.selectedTime];
cell.detailTextLabel.text = stringFromDate;
}
}
}
else if (indexPath.section == 2)
{
if(indexPath.row == 0)
{
cell.textLabel.text = NSLocalizedString(@"Repeat",@"");
cell.detailTextLabel.text = NSLocalizedString(@"Never", @"");
}
}
else if (indexPath.section == 3)
{
if(indexPath.row == 0)
{
cell.textLabel.text = NSLocalizedString(@"Alert", @"");
if(![[[NSUserDefaults standardUserDefaults] valueForKey:@"ringtone"] isEqualToString:@""] && [[NSUserDefaults standardUserDefaults] valueForKey:@"ringtone"] != nil)
{
cell.detailTextLabel.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"ringtone"];
}
else
{
cell.detailTextLabel.text = NSLocalizedString(@"None", @"");
}
}
}
else if (indexPath.section == 4)
{
if(indexPath.row == 0)
{
cell.textLabel.text = NSLocalizedString(@"Calendar", @"");
cell.detailTextLabel.text = NSLocalizedString(@"Home", @"");
}
}
else if(indexPath.section == 5 && indexPath.section != 0)
{
if(indexPath.row == 0)
{
self.urlView.backgroundColor = [UIColor clearColor];
self.urlField.textColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];
[cell addSubview:self.urlView];
}
}
这是方法cellforRowatIndexPath
的代码
任何解决方法。我调试了它,当它出现在第5节if语句时,它找不到节值,它会直接进入if语句。然后出现问题。
我还检查过它是否为零但没有用。
答案 0 :(得分:5)
问题是您对每种类型的单元使用相同的重用单元(或相同批次的重用单元),并在每次重用时添加子视图而不删除它们。您应该为每种类型的单元格使用不同的单元格标识符,并且只在初始化中添加子视图。
编辑:另外,您应该将子视图添加到单元格的contentView,而不是直接添加。
您放置[cell addSubview:whatever]
的所有位置,请替换为[cell.contentView addSubview:whatever]
根据matt对这个答案的第一个评论,这是一个快速而肮脏的方式来实现这个:
要删除单元格的所有子视图:
for (UIView *view in cell.contentView.subviews)
{
[view removeFromSuperview];
}
在您的代码中将此行放在此行之前
cell.detailTextLabel.textColor = [UIColor blackColor];
请记住,在包含许多单元格的表格中,此解决方案不会很好。您应该将每个单元格拆分为自己的类型,或者使用tag
属性跟踪任何自定义子视图。