我有一个tableview单元格,其中添加了collectionview单元格(用于水平滚动)。
现在我想在按下水平collectionview的任何单元格时推送到其他导航控制器。怎么做 ?或如何定义细胞压榨的委托方法。
代码:
ViewController.swift:
class ViewController: UIViewController { var categories = ["Action", "Drama", "Science Fiction", "Kids", "Horror"] } extension ViewController : UITableViewDelegate { } extension ViewController : UITableViewDataSource { func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return categories[section] } func numberOfSections(in tableView: UITableView) -> Int { return categories.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CategoryRow return cell } }
CategoryRow.swift
class CategoryRow : UITableViewCell { @IBOutlet weak var collectionView: UICollectionView! } extension CategoryRow : UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 12 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! VideoCell return cell } } extension CategoryRow : UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let itemsPerRow:CGFloat = 4 let hardCodedPadding:CGFloat = 5 let itemWidth = (collectionView.bounds.width / itemsPerRow) - hardCodedPadding let itemHeight = collectionView.bounds.height - (2 * hardCodedPadding) return CGSize(width: itemWidth, height: itemHeight) } }
VideoCell.swift
class VideoCell : UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! }
在这里,您将didSelectItemAtIndexPath在CategoryRow类上的委托方法上单击单元格,然后可以在其中触发委托以在ViewController ViewController.swift 内部进行调用:
didSelectItemAtIndexPath
CategoryRow
ViewController
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CategoryRow cell.delegate = self return cell }
VideoCell.swift :
protocol CategoryRowDelegate:class { func cellTapped() }
CategoryRow.swift :
class CategoryRow : UITableViewCell { weak var delegate:CategoryRowDelegate? @IBOutlet weak var collectionView: UICollectionView! } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if delegate!= nil { delegate?.cellTapped() } }
在内部添加委托函数 ViewController
func cellTapped(){ //code for navigation }