3

Hello all m having multisectioned tableview design like belowimage

want to apply filter based on the selected rows in which all the selection is in OR condition except the searchcriteria section(this section is mandatory),now what i want to achieve is want to save all the selection and filter the data when user clicks on Apply button.How to achieve this.Please help.

note:i dont want to use any database coz in future i have to post all the selected values using POST method.

Code :

ViewController.swift

import UIKit

class ViewController: UIViewController,ExpandableHeaderViewDelegate,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var tableview: UITableView!

var sections =     [

Section(sectionname: "Year" ,
        cellnames: ["2017-2018","2016-2017","2015-2016"],
        expanded: false,
        subtitle: "Please select a Year"),

Section(sectionname: "School",
        cellnames: ["School A","School B","School C"],
        expanded: false,
        subtitle: "Please select a School"),

Section(sectionname: "SearchCriteria",
        cellnames: ["No of Students","No of Student on RTE","No of Differently Abled Students","No of Student Opted For School Transport"],
        expanded: false,
        subtitle: "Please select your SearchCriteria"),

Section(sectionname: "Class",
        cellnames: ["IX","X","XI","XII"],
        expanded: false,
        subtitle: "Please select a Class"),

Section(sectionname: "Section",
        cellnames: ["A","B","C","D","E"],
        expanded: false,
        subtitle: "Please Select a Section")

]

var selectIndexPath : IndexPath!
override func viewDidLoad() {
    super.viewDidLoad()

    self.tableview.allowsMultipleSelection = true
    selectIndexPath = IndexPath(row: -1, section: -1)
    let nib = UINib(nibName: "ExpandableHeaderView", bundle: nil)
    tableview.register(nib, forHeaderFooterViewReuseIdentifier: "expandableHeaderView")
    // Do any additional setup after loading the view, typically from a nib.
}

func numberOfSections(in tableView: UITableView) -> Int {

    return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].cellnames.count
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if (sections[indexPath.section].expanded)
    {
        return 44
    }
    else
    {
        return 0
    }
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 2
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerview = tableview.dequeueReusableHeaderFooterView(withIdentifier: "expandableHeaderView") as! ExpandableHeaderView
    headerview.customInit(title: sections[section].sectionname, subtitle: sections[section].subtitle, section: section, delegate: self)
    return headerview

}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "labelcell")
    cell?.textLabel?.text = sections[indexPath.section].cellnames[indexPath.row]
    cell?.accessoryType = (indexPath == selectIndexPath) ? .checkmark : .none
    return cell!

}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.selectIndexPath = indexPath
    self.sections[indexPath.section].subtitle = (tableview.cellForRow(at: indexPath)?.textLabel?.text)!
    sections[indexPath.section].expanded = !sections[indexPath.section].expanded
    tableview.beginUpdates()
    tableview.reloadSections([indexPath.section], with: .automatic)
    tableview.endUpdates()

}
func toggleSection(header:ExpandableHeaderView,section : Int)
{
    sections[section].expanded = !sections[section].expanded
    tableview.beginUpdates()
    for i in 0 ..< sections[section].cellnames.count {
        tableview.reloadRows(at: [IndexPath(row: i, section: section)], with: .automatic)
    }
    tableview.endUpdates()
}



@IBAction func done_action(_ sender: Any) {

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

ExpandableHeaderView.xib ExpandableHeaderView.xib

ExpandableHeaderView.swift

 import UIKit
 protocol ExpandableHeaderViewDelegate {
 func toggleSection(header:ExpandableHeaderView,section:Int)

}

class ExpandableHeaderView: UITableViewHeaderFooterView {

var delegate :ExpandableHeaderViewDelegate?
var section : Int!
@IBOutlet weak var TitleLabel: UILabel!

@IBOutlet weak var SubTitleLabel: UILabel!


override init(reuseIdentifier: String?) {
    super.init(reuseIdentifier: reuseIdentifier) 
    self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderView)))

}

required init?(coder aDecoder: NSCoder) {
    super.init(coder : aDecoder )

    self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selectHeaderView)))

}

func selectHeaderView(gesture:UITapGestureRecognizer)
{
    let cell = gesture.view as! ExpandableHeaderView
    delegate?.toggleSection(header: self, section: cell.section)
}
func customInit(title:String,subtitle : String,section:Int,delegate:ExpandableHeaderViewDelegate)
{
    self.TitleLabel.text = title
    self.SubTitleLabel.text = subtitle
    self.section = section
    self.delegate = delegate
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.TitleLabel?.textColor = UIColor.white
    self.SubTitleLabel?.textColor = UIColor.white
    self.SubTitleLabel?.alpha = 0.7
    self.contentView.backgroundColor = UIColor.darkGray
}
 }

Section.swift

 import Foundation

  struct Section
 {
   var sectionname : String!
   var cellnames : [String]!
   var expanded : Bool!
   var subtitle : String!

   init(sectionname:String,cellnames : [String],expanded : Bool,subtitle : String)
  {
    self.sectionname = sectionname
    self.cellnames = cellnames
    self.expanded = expanded
    self.subtitle = subtitle
}
}

Please Help.I googled a lot but cant find the soultion of my scenario.

6
  • did you implementd tableview didselectindexpath Commented Aug 29, 2017 at 6:50
  • no i didnt implemented dont knw how to do this. coz if there will be a case of simple tableview i know how to use didselectindexpath but in my case scenario is totally different. :( i also tried to contact you in yahoo. Commented Aug 29, 2017 at 7:29
  • creteat gloabl array then save indexpath when user click on it when user press save button then you can iterate array Commented Aug 29, 2017 at 7:51
  • will you explain me by editing my code?i know that i have to use array but wht abt headerview and all how can i differentiate selection via section. can i email you my democode? Commented Aug 29, 2017 at 8:16
  • indexPath contain row and section so you can easily identify which section selected if array contain indexPath then remove object ,i m working on company Commented Aug 29, 2017 at 8:30

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.