以编程方式从 collectionView 内的自定义 tableView 中进行 Segue

Posted

技术标签:

【中文标题】以编程方式从 collectionView 内的自定义 tableView 中进行 Segue【英文标题】:Segue programatically from custom tableView inside collectionView 【发布时间】:2016-11-05 08:44:20 【问题描述】:

我有两个班级:

class FeedAndGroupsViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 

class eventsCustomCollectionCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate 

... collectionView 类创建 UITableView 的地方。

单击 tableViewCell 时,我正在尝试创建自定义 segue。我已经为 tableView 实现了 tableView(didSelectRowAt) 函数,它工作正常。但是,我无法从此函数调用 performSegue。有谁知道如何解决这个问题?

【问题讨论】:

【参考方案1】:

这是因为您的类 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


希望这会有所帮助。

【讨论】:

感谢您的帮助!我尝试了您的解决方案,但似乎我无法在函数 cellForItemAt 中调用 collectionViewCell 的委托。 您必须在 UICollectionViewCell 中的 UITableViewDelegate 的 didSelectRowAt 中调用委托方法。我已经更新了我的代码。 太棒了!非常感谢【参考方案2】:

这让我旋转了一段时间。就我而言,我有一个 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)
    

【讨论】:

以上是关于以编程方式从 collectionView 内的自定义 tableView 中进行 Segue的主要内容,如果未能解决你的问题,请参考以下文章

从 CollectionView Cell 以编程方式执行 Segue

以编程方式从 collectionView Cell didSelectItemAt 推送到新的 ViewController - swift

如何以编程方式将 CollectionView 滚动到底部

在 Swift 中以编程方式为 CollectionView 设置插图

Swift:如何以编程方式在 TableViewCell 中显示 CollectionView

如何以编程方式选择collectionview中的项目?