目前我们有一个嵌入在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
}
}
答案 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
responder
到delegatation
。
3:在你的UIViewController
内,你可以按下水龙头,从那里执行/推送/展示你想要的任何内容。
您希望UIViewController
知道发生了什么,而不是来自"隐形"不应该处理这些方法的子类。
通过这种方式,您还可以将delegate protocol
用于将来需要转发到UIViewController
的其他方法(如果需要),简洁明了。