ユーザーに画像を表示するCollectionView
があります。これらをバックグラウンドでダウンロードし、ダウンロードが完了したら、次のfuncを呼び出してcollectionViewCell
を更新し、画像を表示します。
_func handlePhotoDownloadCompletion(notification : NSNotification) {
let userInfo:Dictionary<String,String!> = notification.userInfo as! Dictionary<String,String!>
let id = userInfo["id"]
let index = users_cities.indexOf({$0.id == id})
if index != nil {
let indexPath = NSIndexPath(forRow: index!, inSection: 0)
let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell
if (users_cities[index!].image != nil) {
cell.backgroundImageView.image = users_cities[index!].image!
}
}
}
_
これは、セルが現在画面に表示されている場合は問題なく機能しますが、表示されない場合は、次の行で_fatal error: unexpectedly found nil while unwrapping an Optional value
_エラーが発生します。
_ let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell
_
この場合、とにかく画像がcellForItemAtIndexPath
メソッドで設定されるため、collectionViewCellがまだ表示されていない場合でも、この関数を呼び出す必要はありません。
したがって、私の質問、この関数を変更して、処理しているセルが現在表示されているかどうかを確認する方法を教えてください。 collectionView.visibleCells()
は知っていますが、ここでどのように適用するかわかりません。
現在利用可能なセルを取得
// get visible cells
let visibleIndexPaths = followedCollectionView.indexPathsForVisibleItems()
次に、セルを操作する前に、indexPath
がvisibleIndexPaths
に含まれているかどうかを確認します。
ネストされたUICollectionViewsはまったくスクロールしない必要があるため、contentOffsetが提供されないため、iOSはすべてのセルを常に表示されていると認識します。その場合、画面の境界を参考にすることができます。
let cellRect = cell.contentView.convert(cell.contentView.bounds, to: UIScreen.main.coordinateSpace)
if UIScreen.main.bounds.intersects(cellRect) {
print("cell is visible")
}
単にif collectionView.cellForItem(at: indexPath) == nil { }
を使用できます。 collectionViewは、表示されている場合にのみセルを返します。
またはあなたの場合は具体的に変更します:
let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell
に:
if let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as? FeaturedCitiesCollectionViewCell { }