美文网首页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