3

Ich habe eine CollectionView, die Bilder für den Benutzer anzeigt. Ich lade diese im Hintergrund herunter, und wenn der Download abgeschlossen ist, rufe ich die folgende Funktion auf, um die collectionViewCell zu aktualisieren und das Bild anzuzeigen.Überprüfen Sie, ob die Zelle bei indexPath auf dem Bildschirm sichtbar ist UICollectionView

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! 
     } 
    } 
} 

Dies funktioniert gut, wenn die Zelle auf dem Bildschirm noch sichtbar ist, aber wenn es nicht, dass ich auf der folgenden Zeile erhalten einen fatal error: unexpectedly found nil while unwrapping an Optional value Fehler ist:

let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell 

Nun ist diese Funktion nicht einmal müssen aufgerufen werden, wenn die collectionViewCell noch nicht sichtbar ist, da in diesem Fall das Bild sowieso in der cellForItemAtIndexPath Methode gesetzt wird.

Daher meine Frage, wie kann ich diese Funktion ändern, um zu überprüfen, ob die Zelle, mit der wir es zu tun haben, momentan sichtbar ist oder nicht. Ich kenne die collectionView.visibleCells() jedoch bin ich mir nicht sicher, wie man es hier anwendet.

Antwort

7

followedCollectionView.indexPathsForVisibleItems() Verwendung auf sichtbare Zellen zu erhalten visibleIndexPaths und überprüfen Sie Ihre indexPath in visibleIndexPaths oder nicht enthalten ist, bevor irgendetwas mit Zellen zu tun.

1

Sie können einfach if collectionView.cellForItem(at: indexPath) == nil { } verwenden. Die Auflistungsansicht gibt nur eine Zelle zurück, wenn sie sichtbar ist.

let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as! FeaturedCitiesCollectionViewCell

zu:

if let cell = followedCollectionView.cellForItemAtIndexPath(indexPath) as? FeaturedCitiesCollectionViewCell { }

0

Nested UICollectionViews brauchen oft gar nicht zu bewegen, so dass kein Content immer und so vorgesehen ist,

Oder in Ihrem Fall speziell ändern iOS versteht alle Zellen als immer sichtbar. In diesem Fall ist es möglich, die Bildschirmgrenzen als Referenz zu nehmen:

let cellRect = cell.contentView.convert(cell.contentView.bounds, to: UIScreen.main.coordinateSpace) 
    if UIScreen.main.bounds.intersects(cellRect) { 
     print("cell is visible") 
    }