美文网首页iOS DeveloperiOS 开发每天分享优质文章
iOS Swift TableView实现树形结构列表(展开收起

iOS Swift TableView实现树形结构列表(展开收起

作者: jzhang | 来源:发表于2019-03-21 00:43 被阅读438次

    效果:


    效果

    代码结构:

    image.png
    可以看到分别是4种不同层级的的cell。
    使用方法:
    1、先了解TableViewManager的使用方法。
    2、建立自己的cell的时候,对应的item继承ZJExpandTreeCellItem
    3、以下面代码为例,总共是4层(level 0 ~ level 3),第1层展开,第2层收起(所以实际上看不到3、4层,因为第2层是收起状态),第3层收起,第4层收起(最后一层)。这样这个树形结构的列表就写好了,展开和收起动作框架内会利用递归自动处理。

    Demo里是4层层结构,实际上支持无限层级

            //level 0
            let item0 = Level0CellItem()
            item0.level = 0
            section.add(item: item0)
            //如果isExpand为true,则下一级的item(也就是item1)必须加入section
            item0.isExpand = true
            //level 1
            for _ in 0..<3 {
                let item1 = Level1CellItem()
                //level仅用于记录层级,可以不赋值
                item1.level = 1
                item1.isExpand = false
                section.add(item: item1)
                item0.arrNextLevel.append(item1)
                
                //level 2
                for _ in 0..<3 {
                    let item2 = Level2CellItem()
                    //如果isExpand为false,则后面就不用把item加入section
                    item2.isExpand = false
                    item1.arrNextLevel.append(item2)
                    
                    //level 3
                    for _ in 0..<3 {
                        let item3 = Level3CellItem()
                        item3.isExpand = false
                        item2.arrNextLevel.append(item3)
                    }
                }
            }
            manager.reload()
    

    效果:


    image.png

    ZJExpandTreeCellItem则是负责控制展开收起的核心代码(继承它即可,不需要了解里面的逻辑,这里只是展示一下):

    class ZJExpandTreeCellItem: ZJTableViewItem {
        var level:Int = 0
        var isExpand = true
        var arrNextLevel = [ZJExpandTreeCellItem]()
        
        override init() {
            super.init()
            self.selectionStyle = .none
            self.setSelectionHandler { (callBackItem) in
                let item = callBackItem as! ZJExpandTreeCellItem
                var arrItems = [ZJExpandTreeCellItem]()
                if item.isExpand {
                    //点击之前是打开的,直接通过递归获取item
                    self.recursionForItem(item, outItems: &arrItems)
                    item.isExpand = !item.isExpand
                }else{
                    //点击之前是关闭的,需要先改变isExpand属性(不这么做会导致这一个level下一级的level的cell不显示)
                    item.isExpand = !item.isExpand
                    self.recursionForItem(item, outItems: &arrItems)
                }
                
                if item.isExpand {
                    item.section.insert(arrItems, afterItem: item, animate: .fade)
                }else{
                    item.section.delete(arrItems, afterItem: item, animate: .fade)
                }
            }
        }
        /// 递归获取一个item下面所有显示的item
        func recursionForItem(_ item: ZJExpandTreeCellItem, outItems: inout [ZJExpandTreeCellItem]) {
            for subItem in item.arrNextLevel {
                print(subItem.level)
                if item.isExpand == true {
                    outItems.append(subItem)
                    if item.arrNextLevel.count != 0{
                        recursionForItem(subItem, outItems: &outItems)
                    }
                }
            }
        }
    }
    

    level代表当前cell的层级,可以不传值。如果业务逻辑上有需要判断层级的情况,可以对level赋值,获取当前层级。
    isExpand代表当前cell下的子一级cell是否是展开的。
    arrNextLevel是记录当前cell下的子一级cell。
    ZJExpandTreeCellIteminit方法里的代码是触发点击动作之后的展开收起动作的处理
    recursionForItem方法通过递归获取到当前点击中的cell下面所有层级的cell

    Demo地址:在ZJTableViewManager中ExpandTree页面

    相关文章

      网友评论

        本文标题:iOS Swift TableView实现树形结构列表(展开收起

        本文链接:https://www.haomeiwen.com/subject/hxbxvqtx.html