UITableview混合了细胞

时间:2012-06-06 17:15:34

标签: iphone ios uitableview

我的UITableview有问题。在滚动或推动开关后,它开始有时混合细胞。所以你可以这样,一个单元格的文本显示在另一个单元格中。我读了很多关于tableViews的内容,但我发现没有什么适合我的代码。 这是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];

}

    if (indexPath.section == 0) {
        if (indexPath.row == 0) {
            cell.textLabel.text = NSLocalizedString(@"Course:",@"Course Section");
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = entryTableCourseName;

        }

       else if (indexPath.row == 1) {
            cell.textLabel.text = @"Due Date:";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = entryTableDueDateString;            }
    }

    else if (indexPath.section == 1) {
        if (indexPath.row == 0) {
            //cell.textLabel.text = NSLocalizedString(@"Title", @"entryTableTaskTitle");
            [cell.contentView addSubview:nameField];

        }

        else if (indexPath.row == 1) {
            [cell.contentView addSubview:TaskView];
        }

    }


    else if (indexPath.section == 2) {

        if (entryTableGradeSwitch.on) {
            if (indexPath.row == 0) {
                cell.textLabel.text = NSLocalizedString(@"Grading", @"GradingCell");
                cell.accessoryView = entryTableGradeSwitch;
            }
            else if (indexPath.row == 1) {
                cell.textLabel.text = NSLocalizedString(@"Options", @"GradingCellOptions");
            }
        }
        else {
            cell.textLabel.text = NSLocalizedString(@"Grading", @"GradingCell");
            cell.accessoryView = entryTableGradeSwitch;
        }
    }

}

我觉得我在设置细胞方面做了一些非常错误的事情。

4 个答案:

答案 0 :(得分:2)

这完全归功于细胞可重用性。在StackOverflow上有很多关于此的帖子,我建议你搜索“UITableViewCell Reusability Problems”,你会遇到解决方案。

简而言之。这里发生的是,在滚动时,单元格实际上重新使用之前在indexPath处使用的单元格,而cellForRowAtIndexPath在该索引路径处分配不同的单元格。

解决方案?

  1. 为每个单元格使用不同的重用标识符。
  2. 使用变得混乱的视图或标签对tableViewCell进行子类化。

答案 1 :(得分:1)

确保实施

- (void) prepareForReuse
如果您重复使用,请在您的单元格中

。在此例程中,清除您添加到单元格中的任何不希望在另一次重用中显示的内容。如果您不添加任何自定义项目,请确保在填充单元格时设置所有内容,即使它是空的。

答案 2 :(得分:0)

每次执行此操作:

 [cell.contentView addSubview:TaskView]

或类似的东西,您正在向单元格添加新的子视图。随着单元格的重用,您可以添加越来越多的子视图。

从您的代码中,甚至不清楚nameView和taskView的来源。它们应该在首次创建单元格时添加一次,然后再配置,或者它们应该是xib或storyboard中设计的单元格的一部分。

答案 3 :(得分:0)

这是一个非常简单的解决方案,您仍然可以保留重用标识符!也没有子类化或任何需要的东西。

这很简单:只需确保并设置标签和视图的 所有 。这意味着如果一个单元格不打算使用详细文本标签,仍然将其设置为@""。通过这样做,您可以确保之前使用该单元格的内容中没有剩余数据。

超级简单,每次都有效!还有比不重复使用单元格更好的资源方式。