collectionView:reloadData 有效,reloadItemsAtIndexPaths 无效

collectionView: reloadData works, reloadItemsAtIndexPaths does not

我有一个 UICollectionView 其源数据有时会在屏幕外发生变化。要在 returns 时更新它,我在 CollectionViewController 中写道:

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadData()
}

...这行得通,但我从来不需要在我的 UICollectionView 中更新一个或两个以上的单元格,所以我认为如果我用以下版本替换上面的版本会更好:

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}

...但是当我这样做时,Xcode 给我一个错误提示:

Operand of postfix '!' should have optional type, delete '!'".

当我删除 '!' 时,它说 UICollectionView 没有名为 reloadItemsAtIndexPaths 的成员。我做错了什么?

从你的代码来看,你似乎在最后将你的 collectionView 声明为可选(带有?),并且可能使用 @IBOutlet 将它链接到你的故事板。要解决您的问题,您应该删除 ?来自 :

@IBOutlet var collectionView: UICollectionView?

并将其替换为:

@IBOutlet var collectionView: UICollectionView!

通过这种方式,您告诉编译器您的 collectionView 确实存在(因为您已经从故事板链接了它)。

或者,您可以通过以下方式绑定您的 collectionView:

if let collectionView = collectionView {
    collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}

Swift 3 版本代码

var indexPaths = [IndexPath]()
indexPaths.append(indexPath) //"indexPath" ideally get when tap didSelectItemAt or through long press gesture recogniser.
collectionView.reloadItems(at: indexPaths)

如果你想为单个单元格重新加载,你可以像这样指定单元格的具体信息:-

for index in indexPaths {
            if index == [0, 0] {
                print(index)
                self.collectionView?.reloadItems(at: [index])
            }
        }

希望对您有所帮助。

Swift 4 重新加载部分

中的所有项目
 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    var indexPaths: [NSIndexPath] = []
    for i in 0..<collectionView!.numberOfItems(inSection: 0) {
        indexPaths.append(NSIndexPath(item: i, section: 0))
    }
    collectionView?.reloadItems(at: indexPaths as [IndexPath])
}

作为初学者,我不知道将 collectionView 实现为另一个 viewController 的直接子级并将其实现为 viewController 中的嵌入式视图时存在差异,也许一些dev面临着同样的问题,他们不知道,如果是这样,寻找正确的方法:)