所以,我的问题非常简单。我在UIViewController中有一个UITableView。 tableview有动态单元格(带有图像,文本等的自定义单元格,来自我创建的子类),这些单元格属于我创建的子类。由于每个单元格的内容不同,一切都很顺利。问题是当我滚动单元格的水平滚动视图时(我在单元格的子视图中有一个UIScrollView。我在单元子类上创建了这个滚动视图),比方说,indexPath.row == 0,滚动垂直的桌面视图,在大约8个单元格之后,第九个单元格也滚动了滚动视图。这是因为dequeuereusablecells,所以第九个单元格实际上是第一个,只显示不同的内容,但由于它是第一个单元格,它具有相同的后台操作(滚动滚动视图)。
我试图在java.util.*;
中取消注册但是虽然这解决了问题,但它创建了另一个:滚动的第一个单元格不再存在了。因此,为了解决这个新问题,我计划在这里添加一个解决方法,即[Int:Bool]的字典,即对应于布尔值的indexPath。如果我滚动第一个单元格,则0:true。如果我到达第九个单元格(它等于第一个单元格,但IndexPath = 8),我取消滚动单元格的水平滚动视图。如果我回到tableview的开头并到达第一个单元格,我将单元格的水平滚动视图向后滚动。你们有什么感想?
我能想到的另一种解决方法就是不使用dequeue可重用单元格,因为我不认为我的tableview上会有超过30-50行。 在性能方面,哪种操作更好?
答案 0 :(得分:0)
首先,我建议你仔细分析从第一个单元格中删除滚动偏移是否是一个坏主意。如果我是一个用户,我向下滚动到最底部,让第一个单元格不可见,你确定我滚动回到顶部之后我希望它返回到滚动位置吗?答案可能是肯定的,但您应该仔细考虑这一点,因为它可能会引导您找到最简单的解决方案。
但是,如果你确实需要这样做,我会有一个变量来存储每行的滚动状态。如果您有一个对象数组,您可以从中提取必要的属性(标题,图像等),您可以将其作为额外属性添加到这些对象中。否则,你可以创建一个存储这个信息的数组(我更喜欢这个任务的字典数组)。
答案 1 :(得分:-1)
从根本上讲,这是由表视图单元重用性引起的问题。你可以有变通办法,但我会说,不应该重复使用那些不应该被重用的东西。
如果您的单元格都相似(略有不同),则只能使用一个单元格标识符;如果您有非常不同类型的单元格,比如说,一种类型内部有一个水平滚动视图,一种类型只有一些标签和图像,您可能需要考虑有两个标识符,因此具有UIScrollView的单元格将不会被重用正常细胞。
与此同时,您仍然可以在prepareForReuse:
中进行必要的清理工作,以确保刚出列的单元格有一个新的开始。