表视图委托内的集合视图
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
中是否有标识符为customSegue
的segue
。
【讨论】:
【参考方案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有。以上是关于表视图委托内的集合视图的主要内容,如果未能解决你的问题,请参考以下文章