TableView inside a specific UICollectionViewCell programmatically?

I am trying to add a TableView inside a UICollectionViewCell, so I want to manage this cell myself from the TableView. So to be clearer, if indexPath.row is 2, then I want to call the tableView cell inside the viewPath.row collection.

Please check the image, I did with red, what I want to do. I created everything programmatically using UICollectionViewController and UICollectionViewControllerFlowLayout.

+3


source to share


3 answers


For those who need it, I found a solution:

class CustomizedCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate {

    var tableView = UITableView()
    let cellIdentifier: String = "tableCell"

    override func layoutSubviews() {
        super.layoutSubviews()

        tableView.delegate = self
        tableView.dataSource = self

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellIdentifier)
}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 4
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.value1, reuseIdentifier: cellIdentifier)

    cell.textLabel?.text = "1 CUP"
    cell.detailTextLabel?.text = "Whole"

    return cell
}

      

}

Then, in the viewDidLoad method in the CollectionView, I did the following:



collectionView?.register(CustomizedCell.self, forCellWithReuseIdentifier: "cell")

      

And after that I called it in the cellForRowAt method of the UICollectionView's indexPath:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomizedCell

    return cell
}

      

+3


source


You can create a custom UICollectionView cell for this reference path. And add the table to cell xib.

Implement tableview delegate methods in your custom cell class.



 class CustomCollectionViewCell: UICollectionViewCell, UITableViewDataSource, UITableViewDelegate
  {
    @IBOutlet var tableView: UITableView!

    override func layoutSubviews() 
    {
        super.layoutSubviews()
        tableView.delegate = self
        tableView.dataSource = self
    }
  }

      

+2


source


I found a solution that works for me.

import UIKit

class FirstCollectionViewCell: UICollectionViewCell {

let cellId = "cellId"

let tableView:UITableView = {
    let tableView = UITableView()
    tableView.translatesAutoresizingMaskIntoConstraints = false
    return tableView
}()

override init(frame: CGRect) {
    super.init(frame: frame)
    backgroundColor = .blue

    addSubview(tableView)
    setUpViews()
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":tableView]))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":tableView]))
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init is not done")
}

func setUpViews() {
    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(MyCell.self, forCellReuseIdentifier: cellId) 
}
}

extension FirstCollectionViewCell: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! MyCell
    cell.label.text = "Testing testing"
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 40.0
}
}

class MyCell:UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    setUpViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

// creating a label to display some dummy text
let label:UILabel = {
    let label = UILabel()
    label.text = "test"
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

func setUpViews() {
    addSubview(label)

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":label]))

}
}

      

0


source







All Articles