效果:
效果
代码结构:
可以看到分别是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。
ZJExpandTreeCellItem
的init
方法里的代码是触发点击动作之后的展开收起动作的处理
recursionForItem
方法通过递归获取到当前点击中的cell下面所有层级的cell
Demo地址:在ZJTableViewManager中ExpandTree页面
网友评论