UITableViewCell 持有 UICollectionView 并单击收集单元格 segue

Posted

技术标签:

【中文标题】UITableViewCell 持有 UICollectionView 并单击收集单元格 segue【英文标题】:UITableViewCell holding UICollectionView and click collection cell segue 【发布时间】:2018-04-04 13:14:53 【问题描述】:

我正在使用 Swift3 和 Xcode 8.3.3 我正在研究包含 UICollectionView 的 UITableViewCell。 每个 CollectionView 单元都需要执行 segue。 我的意思是,我需要用导航控制器调用其他 ViewController。所以用户可以回到主 UITableViewController。

import UIKit

class PastCell: UITableViewCell 

    @IBOutlet weak var ptripDtls: UICollectionView!

    var logcount:Int = 0
    override func awakeFromNib() 
        super.awakeFromNib()

        ptripDtls.delegate = self
        ptripDtls.dataSource = self
        logcount = Transfer.tripObj[Transfer.cellpos]["logcount"]! as! Int

        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        let width = self.ptripDtls.collectionViewLayout.collectionViewContentSize.width;
        layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        layout.itemSize = CGSize(width: width-17 , height: 50)
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 1
        ptripDtls!.collectionViewLayout = layout
    

    override func setSelected(_ selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)
    



extension PastCell: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return logcount
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PastTripCollectionCell", for: indexPath) as! PastTripCollectionCell
        return cell
    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        //Might be here segue function will call
    


【问题讨论】:

所以你想在选择集合视图单元格时调用另一个视图控制器 你有什么问题? 让 vc = self.storyboard!.instantiateViewController(withIdentifier: Constant.vc.DestinationVC) as! DestinationVC self.show(vc, sender: self) 在你的 didselect 中写下这两行代码 @GoribDeveloper 这是包含集合的自定义单元格。所以我不能使用你的功能。 @V_rohit 是的,使用导航,所以我可以回来 【参考方案1】:

您实际上有多种选择:

关闭

当您将 tableView 单元格出列时,在 UITableViewCell 内传递一个闭包,如 tapped: (Model) -> Void,并在该闭包内指定执行转场。 (如果您的所有集合单元都执行相同的 segue,则它可以工作,如果应该调用不同的 segue,您可以使用此机制传播您的回调)

委托

定义一个自定义委托,通知您的 viewController 有关 CollectoinView 的 DidSelectItem 方法,然后相应地执行 Segue。

通知

在整个系统中触发一个通知,只有您的 ViewController 会监听该通知,并相应地执行您的 segue。 (这实际上不是一个好的解决方案,只是指出这是可能的)

【讨论】:

我同意你的建议让我试试这个。【参考方案2】:

对于 swift 4,如果您正在使用 segue,请在 didSelectRowAtIndexPath 中使用执行 segue

self.performSegue(withIdentifier: "YourSegueIdentifier", sender: nil)

如果您只使用导航控制器,请使用 Push。

let vc = self.storyboard?.instantiateViewController(withIdentifier: "YourVCIdentifier") as! YourVC

self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

我已经写过我正在开发 swift3,并且 Table Custom Cell 类包含需要执行 segue 的集合和集合单元。

以上是关于UITableViewCell 持有 UICollectionView 并单击收集单元格 segue的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 UITableViewCell 和 UICollectionViewCell 之间共享 xib?

collectionView:didSelectItemAtIndexPath:没有被调用

UITableViewCell 大小不遵循内容视图大小

UITableViewCell 具有基于宽度的固有高度

在自定义 UITableViewCell 中忽略自动布局

UITableView / indexPath.row:为什么if语句排除第10行?