collectionView:reloadData工作,reloadItemsAtIndexPaths没有

Le *_*ale 13 ios uicollectionview swift

UICollectionView在屏幕外时,我的源数据有时会发生变化.要在它返回时更新它,我写道CollectionViewController:

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadData()
}
Run Code Online (Sandbox Code Playgroud)

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

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}
Run Code Online (Sandbox Code Playgroud)

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

postfix'!'的操作数 应该有可选类型,删除'!'".

当我删除'!'时,它表示UICollectionView没有名为的成员reloadItemsAtIndexPaths.我究竟做错了什么?

Val*_*tin 20

从您的代码看,您最近已将collectionView声明为Optional(带?),并可能使用@IBOutlet将其链接到您的故事板.要解决您的问题,您应该删除?来自 :

@IBOutlet var collectionView: UICollectionView?

并用以下代替:

@IBOutlet var collectionView: UICollectionView!

这样你就告诉编译器你的collectionView肯定存在(因为你已经从故事板中链接了它).

或者,您可以通过执行以下操作绑定collectionView:

if let collectionView = collectionView {
    collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}
Run Code Online (Sandbox Code Playgroud)

  • 就这样-谢谢!感谢您的解释,也感谢您回答一个新手的问​​题! (2认同)

小智 6

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])
}
Run Code Online (Sandbox Code Playgroud)