我有两个班级:
class FeedAndGroupsViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}
class eventsCustomCollectionCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate {}
... collectionView类创建UITableView。
我正在尝试在单击tableViewCell时创建自定义segue。我已经为tableView实现了tableView(didSelectRowAt)函数,它工作正常。但是,我无法从此函数调用performSegue。有谁知道如何解决这个问题?
答案 0 :(得分:2)
这是因为您的类eventsCustomCollectionCell是UICollectionViewCell子类而不是UIViewController子类。
func performSegue(withIdentifier identifier: String, sender: Any?)
是UIViewController中可用的方法。因此,对于解决方案,您可以在eventsCustomCollectionCell中创建一个可以有方法
的协议func cellClicked(cell: eventsCustomCollectionCell)
并且您的FeedAndGroupsViewController可以实现此协议并可以调用performSegue。
我已经为您的用例编写了框架代码,您可以参考此代码并开始使用。
class EventsCustomCollectionCell: UICollectionViewCell,UITableViewDelegate{
weak var delegate : EventsCustomCollectionCellDelegate?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.didClick(cell: self)
}
}
protocol EventsCustomCollectionCellDelegate : class{
func didClick(cell:EventsCustomCollectionCell)
}
class FeedAndGroupsViewController: UIViewController,EventsCustomCollectionCellDelegate,UICollectionViewDataSource{
var collectionView : UICollectionView!
var yourArrayForCollectionView = [String]()
func didClick(cell:EventsCustomCollectionCell){
if let index = collectionView.indexPath(for:cell){
let object = yourArrayForCollectionView[index.row]
performSegue(withIdentifier: "Your segue identifier", sender: object)
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Your cell reuse id", for: indexPath) as! EventsCustomCollectionCell
cell.delegate = self
return cell
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
return yourArrayForCollectionView.count
}
}
希望这有帮助。
答案 1 :(得分:0)
这让我旋转了一段时间。在我的例子中,我有一个UITableViewCell,里面有一个UICollectionView。表视图单元格正在保存项目数组。我无法访问ViewController中指定索引的那些项目。此外,不使用故事板,而不是performSegue(withIdentifier: "Your segue identifier", sender: object)
我使用self.navigationController?.pushViewController(detailVC, animated: true)
这是最终为我工作的东西。我必须在协议函数中实际传递对象。
protocol NearbyTableViewCellDelegate : class{
func didClick(cell: EatsItemNearbyTableCell, eat: Eats)
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let eat = nearByEats[indexPath.row]
delegate?.didClick(cell: self, eat: eat)
}
在ViewController中:
extension EatsItemDetailVC: NearbyTableViewCellDelegate {
func didClick(cell: EatsItemNearbyTableCell, eat: Eats) {
let detailVC = EatsItemDetailVC()
detailVC.eat = eat
detailVC.currentLocation = currentLocation
self.navigationController?.pushViewController(detailVC, animated: true)
}
}