poq
poq

Reputation: 11

How to create dynamic tableView within dynamic TableView in swift?

I want to create dynamic tableView within dynamic tableView in swift.

Like this, See Image

For example, in outside in first tableView cell, make 3-row table cell, in second tableView cell, make 1row table cell, ... like this.

If there is an another way to create these kinds of view, please let me know.

Upvotes: 1

Views: 131

Answers (1)

Kenan Begić
Kenan Begić

Reputation: 1228

This can be done in next way. Use tableview with multiple sections. Your section count will be from your nested array of data that you want to show like this:

//MARK: custom tableView cell for header
class CustomHeaderCell: UITableViewCell {
     @IBOutlet weak var titleLabel: UILabel!
     @IBOutlet weak var descriptionLabel: UILabel!
}

//MARK: custom tableView cell for section 
class CustomCell: UITableViewCell {
     @IBOutlet weak var titleLabel: UILabel!
     @IBOutlet weak var descriptionLabel: UILabel!
}

//MARK: Custom model class
class MyClassModelData {
    private var title: String
    private var description: String
    private var mySubModel: [MySubModel]

    init(title: String, description: String, mySubModel: [MySubModel]){
        self.title = title
        self.description = description
        self.mySubModel = mySubModel
    }

    func getTitle() -> String {
        return self.title
    }
    func getDescription() -> String {
        return self.description
    }
    func getSubModelValues() -> [MySubModel] {
        retusn self.mySubModel
    }
}

//MARK: Custom submodel class
class MySubModel {
    private var title: String
    private var description: String

    init(title: String, description: String){
        self.title = title
        self.description = description
    }

    func getTitle() -> String {
        return self.title
    }
    func getDescription() -> String {
        return self.description
    }
}

//MARK: Section table view controller
class MyTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    //Or use UITableViewController

    var sections = [MyClassModelData]()
    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // The below line is to eliminate the empty cells
        self.tableView.tableFooterView = UIView()

        //Delegates for tableView
        self.tableView.delegate = self
        self.tableView.datasource = self        
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 100 //Or UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let section = self.sections[section]

        // Dequeue with the reuse identifier your custom cell or create new one
        let headerCell = self.customTableView.dequeueReusableHeaderFooterView(withIdentifier: "customHeaderCell") as! CustomHeaderCell
        headerCell.titleLabel.text = section.getTitle()
        headerCell.descriptionLabel.text = section.getDescription()

        return headerCell
    }

    // Give a height to our table view cell
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100 //Or UITableViewAutomaticDimension
    }

    // We have only one section
    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    // Rows in section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].getSubModelValues().count
    }

    // Cell creation
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.customTableView.dequeueReusableHeaderFooterView(withIdentifier: "customCell") as! CustomCell
        let sectionData = sections[indexPath.section].getSubModelValues()[indexPath.row]

        cell.titleLabel = sectionData.getTitle()
        cell.descriptionLabel = sectionData.getDescription()

        return cell
    }

}

Also take a look at this post: https://medium.com/swift-programming/swift-enums-and-uitableview-sections-1806b74b8138

Upvotes: 1

Related Questions