表视图委托内的集合视图

Posted

技术标签:

【中文标题】表视图委托内的集合视图【英文标题】:Collection View inside table view delegate 【发布时间】:2019-06-06 06:58:19 【问题描述】:

我有一个表视图,其中表行内有集合视图。 接下来是结构:

MainViewController.swift:

class MainViewController: UIViewController 
     @IBOutlet weak var customTable: UITableView!
     func callSegue() 
         performSegue(withIdentifier: "customSegue", sender: self)
     
     override func viewDidLoad() 
          customTable(UINib(nibName: "CustomTableCell", bundle: nil), forCellReuseIdentifier: "TipsTableCell")
     

extension MainViewController: UITableViewDataSource 
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
         return 1
     
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
          let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
          //Fill cell with my data
          return cell
     

CustomTableCell.swift

class CustomTableCell.swift: UITableViewCell 
     @IBOutlet var collectionView: UICollectionView!
     override func awakeFromNib() 
         super.awakeFromNib()
         self.collectionView.dataSource = self
         self.collectionView.delegate = self
         self.collectionView.register(UINib.init(nibName: "CustomTableCell", bundle: nil), forCellWithReuseIdentifier: "CustomTableCell")
     

extension CustomTableCell: UICollectionViewDataSource, UICollectionViewDelegate 
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
         return dataArray.count

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
 cell.label1.text = dataArray[indexPath.item]
return cell

还有我的 CustomCollectionvCell.swift

class CustomCollectionvCell: UICollectionViewCell 
     @IBOutlet weak var label1: UILabel!
     override func awakeFromNib() 
         super.awakeFromNib()
     

我需要这样的东西: 当我点击 label1.text == "Something" 的单元格时,我需要在 MainViewController 中调用 "callSegue" 函数。

【问题讨论】:

【参考方案1】:

使用 closures 来解决这个问题。

CustomTableCell 中添加一个closure 并在collectionView(_:didSelectItemAt:) 方法中点击collectionViewCell 时调用它,即

class CustomTableCell: UITableViewCell 
    var handler: (()->())?
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        self.handler?()
    

MainViewController 中,设置closure 同时在tableView(_:cellForRowAt:) 方法中将CustomTableCell 出队,即

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
    cell.handler = [weak self] in
        self.callSegue() //here.....
    
    return cell

还要交叉检查您的storyboard 中是否有标识符为customSeguesegue

【讨论】:

【参考方案2】:

在您的情况下,您必须从CustomTableCell.swift 实现委托并在MainViewController.swift 中使用

// MainViewController.swift:

class MainViewController: UIViewController 
    @IBOutlet weak var customTable: UITableView!
    func callSegue() 
        performSegue(withIdentifier: "customSegue", sender: self)
    
    override func viewDidLoad() 
        customTable(UINib(nibName: "CustomTableCell", bundle: nil), forCellReuseIdentifier: "TipsTableCell")
    



extension MainViewController: UITableViewDataSource, collectionViewCellTapped 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 1
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
        //Fill cell with my data
        return cell
    

    func cellTapped(_ text: String) 
        if let text = dataArray[indexPath.item], text == "Something" 
            callSegue()
        
    



// CustomTableCell.swift
protocol collectionViewCellTapped 
    func cellTapped(_ text: String)


class CustomTableCell : UITableViewCell 
    @IBOutlet var collectionView: UICollectionView!
    var delegate: collectionViewCellTapped!
    override func awakeFromNib() 
        super.awakeFromNib()
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.register(UINib.init(nibName: "CustomTableCell", bundle: nil), forCellWithReuseIdentifier: "CustomTableCell")
    


extension CustomTableCell: UICollectionViewDataSource, UICollectionViewDelegate 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return dataArray.count
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomTableCell", for: indexPath) as! CustomTableCell
        cell.label1.text = dataArray[indexPath.item]
        return cell
    

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
        if let delegate = self.delegate 
            delegate.cellTapped(text)
        
    

【讨论】:

当我在我的 CustomTableCell 类中实现此方法时,我在控制台中收到下一个错误:“()没有标识符'customSegue''的segue”,但当然使用标识符segue有。

以上是关于表视图委托内的集合视图的主要内容,如果未能解决你的问题,请参考以下文章

SQL 如何查询指定架构中所有表(或视图)的名称

嵌套 UICollectionViews 的问题

UIView 类中的 Swift 集合视图委托

从视图表中获取数据时出现 Laravel 错误

集合视图内的表视图

预先创建 UICollectionView 单元格 - 布局问题