First of all I would like a result like the following, and without using several tables
So far I have the following behavior
Table code:
@IBOutlet weak var menuTableView: UITableView!
let sectionTitles = [NSLocalizedString("movementsAccount",comment:""), NSLocalizedString("movementsCredit",comment:""),NSLocalizedString("movementsCart",comment:""),NSLocalizedString("movementsInversions",comment:"")]
fileprivate var accountHidden = false { didSet {self.menuTableView.reloadSections(IndexSet.init(integer: 0), with: .automatic)}}
fileprivate var creditHidden = true { didSet {self.menuTableView.reloadSections(IndexSet.init(integer: 1), with: .automatic)}}
fileprivate var cardHidden = true { didSet {self.menuTableView.reloadSections(IndexSet.init(integer: 2), with: .automatic)}}
fileprivate var inversionsHidden = true { didSet {self.menuTableView.reloadSections(IndexSet.init(integer: 3), with: .automatic)}}
var resultAccount = [QueryTransactionModel]()
var resultCollections = [QueryTransactionModel]()
var resultCard = [QueryTransactionModel]()
var resultInversions = [QueryTransactionModel]()
func getCell(cell: PanelHomeTableViewCell, resultTransactions: [QueryTransactionModel], row: Int) ->PanelHomeTableViewCell
{
if (resultTransactions.isEmpty)
{
cell.setupDefaultCell()
return cell
}
cell.setCellValues(phone: resultTransactions[row].dst, amount: resultTransactions[row].amount, date: resultTransactions[row].date, reason: resultTransactions[row].reference)
return cell
}
func getNumberOfRows(results: [QueryTransactionModel]) ->Int
{
if (results.count == 0)
{
return 0
}
else
{
return results.count
}
}
func heigthHeader(results: [QueryTransactionModel])-> CGFloat{
if (results.count == 0){
return 0
}else{
return 40
}
}
@objc func tapOnHeader(_ sender: UITapGestureRecognizer) {
if sender.view?.tag == 0 {
accountHidden = !accountHidden
}
else if sender.view?.tag == 1 {
creditHidden = !creditHidden
}
else if sender.view?.tag == 2 {
cardHidden = !cardHidden
}
else if sender.view?.tag == 3 {
inversionsHidden = !inversionsHidden
}
}
}
extension PanelHomeViewController : UITableViewDelegate,UITableViewDataSource
{
// MARK: - Table view data source
func numberOfSections(in tableView: UITableView) -> Int {
return 4
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch (section) {
case 0:
if accountHidden { return 0 }
return getNumberOfRows(results: self.resultAccount)
case 1:
if creditHidden { return 0 }
return getNumberOfRows(results: self.resultCollections)
case 2:
if cardHidden { return 0 }
return getNumberOfRows(results: self.resultCollections)
case 3:
if inversionsHidden { return 0 }
return getNumberOfRows(results: self.resultCollections)
default:
return 1
}
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 40
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
switch (section)
{
case 0:
return self.heigthHeader(results: self.resultAccount)
case 1:
return self.heigthHeader(results: self.resultCollections)
case 2:
return self.heigthHeader(results: self.resultCollections)
case 3:
return self.heigthHeader(results: self.resultCollections)
default:
return 0
}
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
view.backgroundColor = UIColor.white
view.addBottomBorder(Utils.Color.COLOR_SEPARACIONES, height: 1.5, separation: 0)
let tap = UITapGestureRecognizer.init(target: self, action: #selector(tapOnHeader(_:)))
tap.numberOfTapsRequired = 1
view.tag = section
view.addGestureRecognizer(tap)
let imageView = UIImageView(frame: CGRect(x: 0, y: 10, width: 20 , height: 20))
imageView.image = nil
switch (section)
{
case 0 :
if accountHidden
{
imageView.image = UIImage.init(named:"sideMenu_image")
}
else{
imageView.image = UIImage.init(named:"lessTable")
}
break
case 1:
if creditHidden
{
imageView.image = UIImage.init(named:"sideMenu_image")
}
else{
imageView.image = UIImage.init(named:"lessTable")
}
break
case 2:
if cardHidden
{
imageView.image = UIImage.init(named:"sideMenu_image")
}
else{
imageView.image = UIImage.init(named:"lessTable")
}
break
case 3:
if inversionsHidden
{
imageView.image = UIImage.init(named:"sideMenu_image")
}
else{
imageView.image = UIImage.init(named:"lessTable")
}
break
default:
break
}
view.addSubview(imageView)
let label : UILabel = UILabel()
label.text = sectionTitles[section]
label.frame = CGRect(x: 30, y: 5, width: 200, height: 30)
label.textColor = Utils.Color.COLOR_2B5034
view.addSubview(label)
return view
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = Bundle.main.loadNibNamed("PanelHomeTableViewCell", owner: self, options: nil)?.first as! PanelHomeTableViewCell
switch (indexPath.section)
{
case 0:
return getCell(cell: cell, resultTransactions: self.resultAccount, row: indexPath.row)
case 1:
return getCell(cell: cell, resultTransactions: self.resultCollections, row: indexPath.row)
case 2:
return getCell(cell: cell, resultTransactions: self.resultCard, row: indexPath.row)
case 3:
return getCell(cell: cell, resultTransactions: self.resultInversions, row: indexPath.row)
default:
break
}
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// TODO pasar datos verdaderos de la clse de mapeo de las listas
let row = indexPath.row
switch (indexPath.section)
{
case 0 :
if(resultAccount.isEmpty){
return presenter.goToProducts()
}else{
return presenter.detailsProduct(type:"COR" ,account :"434543332" ,name:"Bruno Sosa",availableBalance:"102.23",totalBalance:"232.23")
}
case 1 :
if(resultCollections.isEmpty){
return presenter.goToProducts()
}else{
return presenter.detailsProduct(type:"COR" ,account :"434543332" ,name:"Bruno Sosa",availableBalance:"102.23",totalBalance:"232.23")
}
case 2 :
if(resultCard.isEmpty){
return presenter.goToProducts()
}else{
return presenter.detailsProduct(type:"COR" ,account :"434543332" ,name:"Bruno Sosa",availableBalance:"102.23",totalBalance:"232.23")
}
case 3 :
if(resultInversions.isEmpty){
return presenter.goToProducts()
}else{
return presenter.detailsProduct(type:"COR" ,account :"434543332" ,name:"Bruno Sosa",availableBalance:"102.23",totalBalance:"232.23")
}
default:
break
}
}
}
It also goes to say that some section may have a subsection like the one in the first example image: TYPE CTA BALANCE but it could be dynamic and could be different between sections, thanks in advance