我为我的collectionview单元写了一个upvote / downvote函数。
我将一个细胞的评分变量与它上面和下面的细胞进行比较。 收到upvote输入后,我有一个包含以下代码的函数。
if cell != CVcellArray.first && cell != CVcellArray.last {
print("NOW CHECKING IP")
let ip_greater = NSIndexPath(forItem: ip!.item - 1, inSection: ip!.section)
let ip_less = NSIndexPath(forItem: ip!.item + 1, inSection: ip!.section)
let cell_greater = self.collectionView?.cellForItemAtIndexPath(ip_greater) as! CollectionViewCell
let cell_less = self.collectionView?.cellForItemAtIndexPath(ip_less) as! CollectionViewCell
// recursive call to allow the cell to jump over repeat scores
if cell.score > cell_greater.score {
checkIPGreater(ip!, origIp: ip!)
}
else if cell.score < cell_less.score {
checkIPLesser(ip!, origIp: ip!)
}
else {
//do nothing
}
}
else {
print("No need to check ip")
}
checkIPLesser / Greater是查看重复分数的函数,这样如果upvoted,单元格可能会跳过多个空格。
当我对顶部/底部单元格进行upvote / downvote时,我崩溃了。这是我假设的,因为swift试图找到一个大于最大单元格或低于最低单元格的单元格,并且它失败了。所以我写了一行来检查被投票的单元格是在第一个单元格数组中还是在单元格数组的末尾。
尽管如此,它仍然失败。我觉得我没有正确找到顶部或底部的细胞。
我有一个部分,该部分中有多个项目(这些项目是单元格)。有什么方法可以访问顶部或底部的项目吗?
答案 0 :(得分:1)
我没有看到崩溃的原因,但是因为你强行展开ip
并且你没有向我们展示ip
来自哪里,我对此表示怀疑。如果您需要帮助确定具体原因,那么如果您从崩溃中发布了更多代码和堆栈跟踪,这将有所帮助。
尽管如此,我认为你的做法是错误的。您应该处理基础数据,而不是处理单元格和索引路径。您的集合视图有一个数据源对象,负责填充单元格,并且该数据源可能与某种数据模型交互。上下投票的数量是数据模型中项目的属性,任何更改都应由模型处理。
如果您以这种方式实现,那么您的集合视图控制器需要做的就是识别已经发生了向上或向下投票并将该信息传递给模型。然后,模型可以更新数据并重新排列项目,这可以像对数组进行排序一样简单。然后,模型将通知任何侦听器项目已更改,并且集合视图控制器将重新加载单元格。