从嵌入在tableview单元格中的uicollectionview执行segue选择?

时间:2017-03-07 00:23:31

标签: ios swift uitableview uicollectionview uicollectionviewcell

目前我们有一个嵌入在tableview单元格中的uicollectionview。当选择集合视图单元时,它假设启动到另一个视图控制器的推送segue。问题是没有选项来执行单元格上的segue。有办法解决吗?这是单元格:

class CastCell : UITableViewCell {

  var castPhotosArray: [CastData] = []

  let extraImageReuseIdentifier = "castCollectCell"
  let detailToPeopleSegueIdentifier = "detailToPeopleSegue"

  var castID: NSNumber?

  @IBOutlet weak var castCollectiontView: UICollectionView!

  override func awakeFromNib() {
    castCollectiontView.delegate = self
    castCollectiontView.dataSource = self
  }
}


extension CastCell: UICollectionViewDataSource {

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return castPhotosArray.count
  }

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = castCollectiontView.dequeueReusableCell(withReuseIdentifier: extraImageReuseIdentifier, for: indexPath) as! CastCollectionViewCell

    cell.actorName.text = castPhotosArray[indexPath.row].name     
    return cell
  }
}

extension CastCell: UICollectionViewDelegate {

     func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
      self.castID = castPhotosArray[indexPath.row].id

     performSegue(withIdentifier: detailToPeopleSegueIdentifier, sender: self) //Use of unresolved identifier 'performSegue' error

    }
}


extension CastCell {
   func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let peopleVC = segue.destination as! PeopleDetailViewController

    peopleVC.id = self.castID
  }
}

2 个答案:

答案 0 :(得分:3)

  

问题是没有选项在单元格上执行segue

在单元格上没有" segue这样的东西"。 segue是从一个视图控制器到另一个视图控制器。 performSegue是一个UIViewController方法。因此,您无法在CastCell类中说出performSegue,因为这意味着self.performSegue,而self是一个UITableViewCell - 它没有performSegue方法。

因此,解决方案是让自己引用控制此场景的视图控制器,并在其上调用performSegue

在像你这样的情况下,我喜欢这种参考的方式是走在响应链上。因此:

var r : UIResponder! = self
repeat { r = r.next } while !(r is UIViewController)
(r as! UIViewController).performSegue(
    withIdentifier: detailToPeopleSegueIdentifier, sender: self)

答案 1 :(得分:1)

1:一种干净的方法是在delegate protocol课程中创建UITableViewCell,并将UIViewController设置为响应者。

2:点击UICollectionViewCell后,处理UITableViewCell内的点按,然后将点击转到UIViewController responderdelegatation

3:在你的UIViewController内,你可以按下水龙头,从那里执行/推送/展示你想要的任何内容。

您希望UIViewController知道发生了什么,而不是来自"隐形"不应该处理这些方法的子类。

通过这种方式,您还可以将delegate protocol用于将来需要转发到UIViewController的其他方法(如果需要),简洁明了。