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面临着同样的问题,他们不知道,如果是这样,寻找正确的方法:)
我有一个 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面临着同样的问题,他们不知道,如果是这样,寻找正确的方法:)