2017-10-14 68 views
1

我有一個collectionview單元格,它上面有一個圖像,下面有一個按鈕。現在,當我點擊這個按鈕時,我想加載一個tableviewCell,其上有來自collectionview的圖像。要做到這一點,我這樣做最初..在collectionview中訪問indexPath

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

photoThumbnail的定義是這樣的... var photoThumbnail: UIImageView!但這樣做給人一種崩潰告訴'Unexpectedly found nil while unwrapping an optional value'所以,我想這個..

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

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

但同樣,Unexpectedly found nil....也發生了同樣的崩潰。任何想法可能是什麼問題..?

編輯: 這是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

添加您的CollectionView(_的CollectionView:?UICollectionView方法的代碼 – iPatel

+0

並解釋其中一線錯誤發生在 –

+0

你的意思是cellForItemAt ... @iPatel – bws

回答

1

碼這是因爲你同獲得nil您indexPath。

另一種方法是

collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath方法

設置標籤細胞的按鈕像

cell.myButton.tag = indexPath.item 

,並在下面的代碼SellBtnTapped方法中使用得到indexPath

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

現在通過使用cell您可以獲取其上的圖像對象或使用self.arrayOfURLImages來獲取正確的圖像。並做更多的事情。

+0

它仍然崩潰...這就是我做的... let indexPath = NSIndexPath(item:sender .tag,section:0) self .photoThumbnail.image = self.arrayOfURLImages [indexPath.row] – bws

+0

您是否將我的代碼設置爲cellForItemAt方法?提供此方法的代碼 – iPatel

+0

我已編輯該問題並添加了cellForItemAt的代碼。 – bws

1

我更喜歡完全避免使用標籤。我前一段時間寫過,但仍然覺得很有用。

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

} 

這就使你的行動統一到

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

已經想出瞭解決方案已經沒有標籤,@Jeffery托馬斯......但謝謝你的答案...給了upvote ... :) – bws

相關問題