导航单击tableview内的collectionview单元格

时间:2017-07-11 09:04:59

标签: ios swift uitableview uicollectionview

我有一个tableview单元格,我在其中添加了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!
}

4 个答案:

答案 0 :(得分:3)

在这里,您将在didSelectItemAtIndexPath课程的代理方法CategoryRow上点击该单元格,然后您可以从那里开始委托以在ViewController内拨打电话 ViewController.swift

    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
}

答案 1 :(得分:1)

我认为在这种情况下使用通知会更好。

在集合视图didSelectItem中发布通知

NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil)

并在viewController viewDidLoad中添加一个观察者,如下所示

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(pushToNew(_:)), name: notificationIdentifier, object: nil)

在新的pushToNew函数中,执行你的segue

func pushToNew(notification: Notification) {
    // perform your segue here. Navigate to next view controller
}

答案 2 :(得分:1)

首先从 CategoryRow.swift 创建委托协议,如下面的代码

protocol CollectionViewSelectionDelegate: class {
    func didSelectedCollectionViewItem(selectedObject: AnyObject)
}

现在在 VideoCell.swift 上创建委托对象,如下所示

weak var delegate:CollectionViewSelectionDelegate? 

在返回单元格

之前更改 ViewController.swift 代码
cell?.delegate = self

在ViewController.swift中覆盖委托方法,并从UICollectionView Delegate方法调用VideoCell.swift中的类似方法。

答案 3 :(得分:-1)

制定协议

protocol collectionViewCellClicked{
    func cellClicked()
}
  • 在主视图控制器中实现此协议您的视图控制器如下所示

    class ViewController: UITableViewController, collectionViewCellClicked{ func cellClicked(){ // Your Code  }}
    
  • 您的cellForRowAt委托看起来像这样

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: <#T##String#>, for: <#T##IndexPath#>) cell.delegate = self return cell }

  • 在表格视图单元格中创建类型为collectionViewCellClicked 的变量 var delegate: collectionViewCellClicked?

    和您的didSelectItemAt委托

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { delegate.cellClicked() }