在swift UICollectionview中更新单个单元格

时间:2017-09-16 18:20:17

标签: ios swift uicollectionview

我有一个简单的刽子手游戏,我希望使用UIcollectionview更优雅,但是让单个细胞更新会导致我的头发更多掉线!!

代码的逻辑工作,如果我尝试插入或删除一个单元格,应用程序崩溃,indexPath变量打印出来,但UIcollectionview单元格拒绝更新。

我使用Xcode的故事板来创建视图,它有一个命名的插座和原型单元格,视图快乐地填充但不会改变,我做错了什么?任何帮助将不胜感激。

let indexPath1 = IndexPath(item: item!, section: 0)
reloadCollectionView(indexPath: indexPath1 as NSIndexPath?)

然后我打电话给:

func reloadCollectionView(indexPath:NSIndexPath?) {
    print("reload indexPath item: \(indexPath?.item) and section: \(indexPath?.section)")
    if (indexPath != nil){
        let cell = collectionOutlet.cellForItem(at: indexPath as! IndexPath) as! ElementsCollectionViewCell

        let section = indexPath?.section

        if section == 0 {

                    cell.letterLabel.text = self.lettersArray0[(indexPath?.item)!]
                    collectionOutlet.reloadItems(at: [indexPath as! IndexPath])

                    print(" Cell text: \(cell.letterLabel.text ?? "NOWT")")
               //collectionOutlet.reloadData()
                    print("Index \(indexPath)")

}

2 个答案:

答案 0 :(得分:2)

如果您只想更新一个单元格,而不是重新加载整个集合视图,则可以执行以下操作:

collectionOutlet.performBatchUpdates({
    collectionOutlet.reloadItems(at: [indexPath])
}){
    // optional closure
    print(“finished updating cell”)
}

performBatchUpdates Documentation reloadItems Documentation

答案 1 :(得分:1)

cellForItemAt方法更新您的单元格。获取单元格更新的正确方法是更新模型,然后重新加载集合视图,该视图将调用cellForItemAt并根据模型重新绘制单元格。

在您的情况下,您的模型看起来像self.lettersArray0,因此请确保在调用重新加载之前已更新。

您可以使用以下任何一种方法重新加载单元格:

    collectionView?.reloadData()
    collectionView?.reloadItems(at: )
    collectionView?.reloadSections(sections:)