我的设置

我在主故事板上的UITableViewCell中有一个UITableViewController。它填充有从REST API中提取的一些JSON数据,这将导致每个单元格的高度可变。有instagramt风格的UIImageViewsUILabels都具有不同的高度和样式。

我的问题

当我滚动到第5或第6单元格,然后返回时,它们开始重新绘制和重叠,因此文本变得混合,线条重新绘制,等等。

我尝试过的内容

在SO上,这似乎是一个常见问题,因此我尝试了几种已发布的解决方案。看来我的问题可能与其他人面临的问题相同,也就是说,每次出队时,我都会在单元格上调用addSubview,但是我尝试检查该单元格是否已经存在。我在某处(对不起,我不记得在哪里)碰到另一篇帖子,这表明由于我正在情节提要中创建此帖子,因此它已经初始化,并且if ( !cell )已经返回false,所以我不知道如何防止它从重画。

当我尝试从情节提要中删除单元格并以编程方式创建它时,我收到一条错误消息,提示它找不到具有标识符@"Cell"的单元格。

我还尝试了某人出队时删除所有子视图的解决方案,因此我使用了:

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

它什么也没找到。

最佳答案

@rdelmar的评论是正确的。你不应该做你正在做的事情。可能会起作用,但这是不好的形式,您不想养成不良的习惯。

首先,利用面向对象的编程。单元应该能够根据您要求其显示的数据进行自我配置。表格视图不应设计单元格。

UITableViewCells需要进行速度优化。创建和添加子视图是一个缓慢的过程。可以一次执行,但是单元将被重用(系统优化),您应该重用第一次创建单元时添加的现有视图。

例如,您可以隐藏不需要的子视图。您可能需要在-prepareForReuse中执行此操作。您可以在-layoutSubviews中移动它们。或在-updateConstraints中更改子视图的位置。

通常,您只想将数据从数据源(通常是视图控制器)传递给表视图单元子类。让单元执行显示工作。

关于ios - UITableViewCell在出队时重绘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30067353/

10-10 14:22