在 tableview 中执行 segue 集合视图

Posted

技术标签:

【中文标题】在 tableview 中执行 segue 集合视图【英文标题】:perform segue collection view inside a tableview 【发布时间】:2019-09-30 07:57:17 【问题描述】:

我有嵌入到 UITableView 中的 UICollectionview。 现在我想在用户单击单元格时对新的 ViewController 执行 segue

导入 UIKit

类 productsTableViewCell: UITableViewCell,UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout

var imgArr = [
    UIImage(named: "1000008614"),
    UIImage(named: "1000008621"),
    UIImage(named: "1000008629")
]

var imgName = [
    "iPhone XS",
    "iPhone XS Max",
    "iPhone 11"
]

var imgPrice = [
    "15,000,000 T",
    "17,000,000 T",
    "21,000,000 T"
]

@IBOutlet weak var btnShowAll: UIButton!
@IBOutlet weak var lblSectionName: UILabel!
@IBOutlet weak var ProductsCollectionVIew: UICollectionView!
override func awakeFromNib() 
    super.awakeFromNib()

    ProductsCollectionVIew.delegate = self
    ProductsCollectionVIew.dataSource = self
    ProductsCollectionVIew.reloadData()

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


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Products", for: indexPath) as! ProductCollectionViewCell

    cell.imgProduct.image = imgArr[indexPath.row]
    cell.lblProductName.text = imgName[indexPath.row]
    cell.lblPrice.text = imgPrice[indexPath.row]
    return cell


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat 
    return 0.0

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat 
    return 0.0

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets 
    return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)


func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    //here I can't use self.performSegue(withIdentifier: "identifier", sender: self)

@IBAction func btnShowAllAction(_ sender: Any) 


我无法对新的视图控制器执行 segue 请帮我。 谢谢

【问题讨论】:

“我无法执行segue”是什么意思?是否有任何错误信息或什么?你能提供一些示例项目,即在 github 上吗? 在 didSelectitemAt 函数中,当我使用 performSegue(withIdentifier: "identifier", sender: self) 时,它说“使用未解析的标识符 'performSegue'” 你给segue identifire了吗?? 【参考方案1】:

您不能在UITableViewCell 子类中使用performSegue(),因为此方法仅在UIViewControllers 中可用。

您的问题有一个简单的解决方案 - 您可以将“回调”添加到单元格并在视图控制器中填写此回调。

你的手机:

class ProductsTableViewCell: UITableViewCell 
    var didSelectItemAction: ((IndexPath) -> Void)?

    //...

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        didSelectItemAction?(indexPath)
    

视图控制器中的代码:

class ViewController: UITableViewController 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
        guard let productsCell = cell as? ProductsTableViewCell else 
            return cell
        

        productsCell.didSelectItemAction =  [weak self] indexPath in
            self?.performSegue(withIdentifier: "yourID", sender: self)
        

        return productsCell
    


【讨论】:

【参考方案2】:

如果您收到上述代码的警告,您可以简单地这样做:

let Tablecell = MyTableview.dequeueReusableCell(withIdentifier: MyCellID, for: indexPath) as! MyTableViewCell

        Tablecell.configureCell() // this is function which setups my collection view

        let collectionCell = Tablecell

        collectionCell.didSelectItemAction =  [weak self] indexPath in

                self?.performSegue(withIdentifier: "SegueID", sender: self)
            

            return collectionCell
        

【讨论】:

以上是关于在 tableview 中执行 segue 集合视图的主要内容,如果未能解决你的问题,请参考以下文章

通过 tableview 中的按钮进行 segue 执行 2 个 segue 而不是一个

以编程方式选择 tableview 上的单元格不会执行关联的 segue

单击TableView部分中的任意位置后如何执行segue?

在 tableviewcell 中使用 UITableview 执行 segue

如何以编程方式从 TableView 执行 segue

使用动态tableView的tableViewCell中的动态collectionViewCell执行Segue With Identifier,swift