Reputation: 11
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
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