2017-10-14 2 views
1

J'ai une cellule de vue de collection qui contient une image et un bouton en dessous. Maintenant, quand je clique sur ce bouton, je veux charger un tableviewCell qui a l'image de la collection. Pour ce faire, je l'ai fait d'abord ..Accès à indexPath dans une vue de collection

func SellBtnTapped(_ sender: UIButton) { 
    let indexPath = collectionView?.indexPath(for: ((sender.superview?.superview) as! RecipeCollectionViewCell)) 
self.photoThumbnail.image = self.arrayOfURLImages[(indexPath?.row)!] 

et photoThumbnail est défini comme si ... var photoThumbnail: UIImageView! Mais faire cela donne un accident dire 'Unexpectedly found nil while unwrapping an optional value' donc j'ai essayé ce ..

let point = sender.convert(CGPoint.zero, to: self.collectionView) 
let myIndexPath = self.collectionView.indexPathForItem(at: point) 

self.photoThumbnail.image = self.arrayOfURLImages[(myIndexPath?.row)!] 

Mais encore une fois , le même accident de Unexpectedly found nil.... se passe. Une idée de ce qui pourrait être le problème ..?

EDIT: Ceci est le code pour cellForItemAtIndex...

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath as IndexPath) as! RecipeCollectionViewCell 

cell.sellButton.tag = indexPath.item 

cell.sellButton.addTarget(self,action: #selector(SellBtnTapped(_:)),for: .touchUpInside) 

return cell 
} 
+0

Ajouter votre CollectionView (_ CollectionView:.? UICollectionView code méthode – iPatel

+0

expliquer aussi quelle ligne l'erreur se produit sur –

+0

vous dire la cellForItemAt ... @iPatel – bws

Répondre

1

C'est parce que vous tous les jours obtenez votre nil indexPath.

Une autre approche est

dans collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath méthode

définir un tag de votre bouton de la cellule comme

cell.myButton.tag = indexPath.item 

Et SellBtnTapped utilisation de la méthode ci-dessous le code pour obtenir indexPath

let indexPath = NSIndexPath(item: sender.tag, section: 0) // set section as you want 
let cell = collectionView.cellForItem(at: indexPath as NSIndexPath) as! RecipeCollectionViewCell 

Maintenant, en utilisant cellule vous pouvez obtenir l'objet image qui est sur elle ou utiliser self.arrayOfURLImages pour obtenir la bonne image. et faites vos autres trucs.

+0

Il plante toujours ... c'était ce que j'ai fait ... laissez indexPath = NSIndexPath (item: expéditeur .tag, section: 0) .photoThumbnail.image = self.arrayOfURLImages [indexPath.row] – bws

+0

Avez-vous défini mon code dans la méthode cellForItemAt? fournir le code de cette méthode – iPatel

+0

J'ai édité la question et ajouté le code de cellForItemAt .. – bws

1

Je préfère éviter complètement les balises. J'ai écrit cela il y a un moment et je le trouve toujours utile.

extension UIView { 

    var superCollectionViewCell: UICollectionViewCell? { 
     if let cell = self as? UICollectionViewCell { 
      return cell 
     } else { 
      return superview?.superCollectionViewCell 
     } 
    } 

    var superCollectionView: UICollectionView? { 
     if let collectionView = self as? UICollectionView { 
      return collectionView 
     } else { 
      return superview?.superCollectionView 
     } 
    } 

    var indexPathOfSuperCollectionViewCell: IndexPath? { 
     guard let cell = superCollectionViewCell, let collectionView = superCollectionView else { return nil } 

     return collectionView.indexPath(for: cell) 
    } 

} 

Cela transforme votre action en

func SellBtnTapped(_ sender: UIButton) { 
    guard let indexPath = sender.indexPathOfSuperCollectionViewCell else { 
     print("button has no index path") 
     return 
    } 

    self.photoThumbnail.image = self.arrayOfURLImages[indexPath.row] 
} 
+0

A déjà trouvé la solution sans balises, @Jeffery Thomas ... mais merci pour la réponse ... Ont donné une upvote ... :) – bws