0

我的表格视图中有一个非常奇怪的问题。
我为表格视图使用不同的部分,每个部分都有不同的行数。我在表格视图的单元格中有一些文本字段。问题是,当我向下滚动表格视图时,第一节文本字段的第一个单元格和最后一节第一行文本字段相互重叠。当我向上滚动表格视图时,也会发生同样的事情。

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 语句中。然后问题就出现了。我还检查了它是否为零但没有用。

4

1 回答 1

5

问题是您对每种类型的单元格都使用相同的重用单元格(或同一批重用单元格),并且每次重用子视图时都添加子视图,然后再将其删除。您应该为每种类型的单元格使用不同的单元格标识符,并且只在初始化时添加子视图。

编辑:另外,您应该将子视图添加到单元格的 contentView,而不是直接添加到它。

你放的任何地方[cell addSubview:whatever],替换为[cell.contentView addSubview:whatever]

根据马特对此答案的第一条评论,这是一种快速而肮脏的实现方式:

为了删除一个单元格的所有子视图:

for (UIView *view in cell.contentView.subviews) 
{
    [view removeFromSuperview];
}

把它放在代码中这一行之前

cell.detailTextLabel.textColor = [UIColor blackColor];

请记住,此解决方案在包含许多单元格的表格中效果不佳。您应该真正将每个单元格拆分为自己的类型,也许您可​​以通过使用它们的tag属性来跟踪任何自定义子视图。

于 2013-04-25T16:37:36.947 回答