内容简介:项目需求需要对用户根据推荐人的不同进行树形结构显示.使用 tableView 实现这一需求.使用 tableView 实现先树形结构(不同的 cell 样式显示不同的等级),当点击 cell 时,判断当前点击的 cell 是否存在下一级,是否已经是打开状态.如果存在下一级,关闭状态,则通过插入 cell 实现点击展开树形图的效果.如果存在下一级且已经展开则通过删除 cell的方式实现树形图的关闭效果.
项目需求需要对用户根据推荐人的不同进行树形结构显示.使用 tableView 实现这一需求.
实现思路
使用 tableView 实现先树形结构(不同的 cell 样式显示不同的等级),当点击 cell 时,判断当前点击的 cell 是否存在下一级,是否已经是打开状态.如果存在下一级,关闭状态,则通过插入 cell 实现点击展开树形图的效果.如果存在下一级且已经展开则通过删除 cell的方式实现树形图的关闭效果.
具体实现
- 定义数据结构类型,如下:
class YTTTreeListModel: NSObject {
/**
你所需要的属性
var name: String = ""
var address: String = ""
var age: Int = -1
...
**/
// 当前节点是否有下一级
var isShow: Bool = false
// 当前节点是否展开
var isOpen: Bool = false
// 当前的等级
var level: Int = 0
// 当前节点的子节点
var child: [QWMyTeamModel] = []
}
复制代码
- 定义主要的方法(递归算法)
/// 获取 cell 的行数
///
/// - Parameter items: 数据源
/// - Returns: cell 行数
private func getRowsNum(_ items: [YTTTreeListModel]) -> Int {
var num = 0
items.forEach { (model) in
num += 1
if model.isShow && model.isOpen && model.child.count > 0 {
num += getRowsNum(model.child)
}
}
return num
}
/// 获取当前 cell 的数据模型
///
/// - Parameters:
/// - items: 数据源
/// - index: 当前位置
/// - Returns: 数据模型
private func getItem(_ items: [YTTTreeListModel], index: inout Int) -> YTTTreeListModel? {
for item in items {
if index == 0 {
return item
}
index -= 1
if item.isShow && item.isOpen && item.child.count > 0 {
if let model = getItem(item.child, index: &index) {
return model
}
}
}
return nil
}
/// 获取需要添加或删除的 cell
///
/// - Parameters:
/// - item: 当前数据模型(点击的 cell)
/// - index: 当前位置
/// - Returns: 需要删除或添加位置
private func getIndexPath(_ item: YTTTreeListModel, index: inout Int) -> [IndexPath] {
var indexPaths: [IndexPath] = []
for item in item.child {
index += 1
indexPaths.append(IndexPath(row: index, section: 0))
if item.isShow && item.isOpen && item.child.count > 0 {
indexPaths.append(contentsOf: getIndexPath(item, index: &index))
}
}
return indexPaths
}
复制代码
- 实现代理方法
// dataArr private var dataArr: [YTTTreeListModel] = []
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return getRowsNum(dataArr)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var index = indexPath.row
if let model = getItem(dataArr, index: &index) {
if model.level == 1 {
// 返回第一级样式
} else if model.level == 2 {
// 返回第二级样式
}else if model.level == 3 {
// 返回第三级样式
}
...
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var index = indexPath.row
if let model = getItem(dataArr, index: &index) {
if model.isOpen {
tableView.beginUpdates()
model.isOpen = false
var ind = indexPath.row
tableView.reloadRows(at: [indexPath], with: .none)
tableView.deleteRows(at: getIndexPath(model, index: &ind), with: .none)
tableView.endUpdates()
}else {
if !model.isShow {
return
}
// 存在下一级且子级已经加载直接展开
if model.isShow == 1 && model.child.count > 0 {
tableView.beginUpdates()
model.isOpen = true
var ind = indexPath.row
tableView.reloadRows(at: [indexPath], with: .none)
tableView.insertRows(at: getIndexPath(model, index: &ind), with: .none)
tableView.endUpdates()
}else {
// 存在下一级,但数据未请 求网络请求
http.globalPOST(url: **, parameters: ["": ""], success: { [weak self] (result) in
if let models = YTTTreeListModel(dictArray: result) as? [YTTTreeListModel] {
model.child = models.compactMap({ (item) -> YTTTreeListModel in
item.level = model.level + 1 // 设置等级
return item
})
tableView.beginUpdates()
model.isOpen = true
var ind = indexPath.row
tableView.reloadRows(at: [indexPath], with: .none)
if let indexs = self?.getIndexPath(model, index: &ind) {
tableView.insertRows(at: indexs, with: .none)
}
tableView.endUpdates()
}
}, fail: {(error) in
}, isHUD: true)
}
}
}
}
复制代码
以上所述就是小编给大家介绍的《记录一次树形分级列表的实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 场景贴图的分级策略
- 利用最近的闲暇,重新上线了 MPAA 电影分级插件
- Django中使用 Closure Table 储存无限分级数据
- 十分钟看懂时序数据库(IV)- 分级存储
- 基于Ceph对象存储的分级混合云存储方案 | U刻
- Odoo 商城模块 Oejia_weshop v0.2.3 发布,多种客户资产及客户分级,多商户管理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First HTML5 Programming
Eric Freeman、Elisabeth Robson / O'Reilly Media / 2011-10-18 / USD 49.99
What can HTML5 do for you? If you're a web developer looking to use this new version of HTML, you might be wondering how much has really changed. Head First HTML5 Programming introduces the key featur......一起来看看 《Head First HTML5 Programming》 这本书的介绍吧!