Making Simple Accordion TableView in swift?

隐身守侯 提交于 2019-11-28 10:35:41

The answer provided by @TechBee works fine using sections for those interested in not using sections and use cells.

The implementation of an Accordion Menu in Swift can be achieved using UITableView in a very simple way, just having two cells one for the parent cells and another for the childs cells and in every moment keep the track for the cells expanded or collapsed because it can change the indexPath.row every time a new cell is expanded or collapsed.

Using the functions insertRowsAtIndexPaths(_:withRowAnimation:) and deleteRowsAtIndexPaths(_:withRowAnimation:) always inside a block of call to tableView.beginUpdates() and tableView.endUpdates() and updating the total of items in the data source or simulating it changes we can achieve the insertion of deletion of new cells in the UITableView in a very easy way with animation included.

I've implemented myself a repository in Github with all the explained above AccordionMenu using Swift and UITableView in a easy and understandable way. It allows several cells expanded or only one at time.

Try this:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    arrayForBool = ["0","0","0"]
    sectionTitleArray = ["Pool A","Pool B","Pool C"]
    var tmp1 : NSArray = ["New Zealand","Australia","Bangladesh","Sri Lanka"]
    var string1 = sectionTitleArray .objectAtIndex(0) as? String
    [sectionContentDict .setValue(tmp1, forKey:string1! )]
    var tmp2 : NSArray = ["India","South Africa","UAE","Pakistan"]
    string1 = sectionTitleArray .objectAtIndex(1) as? String
    [sectionContentDict .setValue(tmp2, forKey:string1! )]


    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")


}

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

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return sectionTitleArray.count
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{

    if(arrayForBool .objectAtIndex(section).boolValue == true)
    {
        var tps = sectionTitleArray.objectAtIndex(section) as! String
        var count1 = (sectionContentDict.valueForKey(tps)) as! NSArray
        return count1.count
    }
    return 0;
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return "ABC"
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 50
}

func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return 1
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if(arrayForBool .objectAtIndex(indexPath.section).boolValue == true){
        return 100
    }

    return 2;
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = UIView(frame: CGRectMake(0, 0, tableView.frame.size.width, 40))
    headerView.backgroundColor = UIColor.grayColor()
    headerView.tag = section

    let headerString = UILabel(frame: CGRect(x: 10, y: 10, width: tableView.frame.size.width-10, height: 30)) as UILabel
    headerString.text = sectionTitleArray.objectAtIndex(section) as? String
    headerView .addSubview(headerString)

    let headerTapped = UITapGestureRecognizer (target: self, action:"sectionHeaderTapped:")
    headerView .addGestureRecognizer(headerTapped)

    return headerView
}

func sectionHeaderTapped(recognizer: UITapGestureRecognizer) {
    println("Tapping working")
    println(recognizer.view?.tag)

    var indexPath : NSIndexPath = NSIndexPath(forRow: 0, inSection:(recognizer.view?.tag as Int!)!)
    if (indexPath.row == 0) {

        var collapsed = arrayForBool .objectAtIndex(indexPath.section).boolValue
        collapsed       = !collapsed;

        arrayForBool .replaceObjectAtIndex(indexPath.section, withObject: collapsed)
        //reload specific section animated
        var range = NSMakeRange(indexPath.section, 1)
        var sectionToReload = NSIndexSet(indexesInRange: range)
        self.tableView .reloadSections(sectionToReload, withRowAnimation:UITableViewRowAnimation.Fade)
    }

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

    let CellIdentifier = "Cell"
    var cell :UITableViewCell
    cell = self.tableView.dequeueReusableCellWithIdentifier(CellIdentifier) as! UITableViewCell

    var manyCells : Bool = arrayForBool .objectAtIndex(indexPath.section).boolValue

    if (!manyCells) {
        //  cell.textLabel.text = @"click to enlarge";
    }
    else{
        var content = sectionContentDict .valueForKey(sectionTitleArray.objectAtIndex(indexPath.section) as! String) as! NSArray
        cell.textLabel?.text = content .objectAtIndex(indexPath.row) as? String
        cell.backgroundColor = UIColor .greenColor()
    }

    return cell
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!