我的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;
}
}
}
我觉得我在设置细胞方面做了一些非常错误的事情。
答案 0 :(得分:2)
这完全归功于细胞可重用性。在StackOverflow上有很多关于此的帖子,我建议你搜索“UITableViewCell Reusability Problems”,你会遇到解决方案。
简而言之。这里发生的是,在滚动时,单元格实际上重新使用之前在indexPath处使用的单元格,而cellForRowAtIndexPath在该索引路径处分配不同的单元格。
解决方案?
答案 1 :(得分:1)
确保实施
- (void) prepareForReuse
如果您重复使用,请在您的单元格中。在此例程中,清除您添加到单元格中的任何不希望在另一次重用中显示的内容。如果您不添加任何自定义项目,请确保在填充单元格时设置所有内容,即使它是空的。
答案 2 :(得分:0)
每次执行此操作:
[cell.contentView addSubview:TaskView]
或类似的东西,您正在向单元格添加新的子视图。随着单元格的重用,您可以添加越来越多的子视图。
从您的代码中,甚至不清楚nameView和taskView的来源。它们应该在首次创建单元格时添加一次,然后再配置,或者它们应该是xib或storyboard中设计的单元格的一部分。
答案 3 :(得分:0)
这是一个非常简单的解决方案,您仍然可以保留重用标识符!也没有子类化或任何需要的东西。
这很简单:只需确保并设置标签和视图的 所有 。这意味着如果一个单元格不打算使用详细文本标签,仍然将其设置为@""
。通过这样做,您可以确保之前使用该单元格的内容中没有剩余数据。
超级简单,每次都有效!还有比不重复使用单元格更好的资源方式。