iOS 动态树形结构 - 实现多级菜单,附带复选框功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 动态树形结构 - 实现多级菜单,附带复选框功能相关的知识,希望对你有一定的参考价值。
参考技术A 关键词: 递归 多级菜单 复选1.显示多级菜单,默认显示一级.
2.可以通过点击有子级的行展开菜单
3.通过复选框,改变选中状态。状态有全选、半选、未选中
4.可以扩展获取当前所选的条目集合
1.首先根Datasource进行数据处理
2.生成一个handler:MultilevelDataHandler 将数据处理逻辑在handle处理,将数据处理隔离
3.建立一个数据模型,需要用一些属性记录层级关系。最后我用了一个字典来记录原始的数据信息。
这里是Demo的数据Json
4.将jsonDictionary转化成数据模型的时候,把层级关系也一并赋值。
由于数据层级数量的不确定性,这里用递归的方式把每层的数据结构都放到其父类的subArray当中。
5.建一个新的数组用来存储要在tableView上展示的数据模型,按照父类子类,父类子类的顺序排列。我这里默认是把第一级全部关闭展示的
6.实现菜单展开关闭功能
7.实现复选框功能
根据locationArray里记录的每一层父级的序号,找到当前model的父级
由于层级数量的不确定性,所以多次使用到了递归的方式。要注意递归的结束条件,必须陷入死循环当中。
https://github.com/YuTongHon/MultilevelMenuWithCheckbox
多级伸缩菜单——组合模式
常见的后台管理模板都有一个伸缩菜单,我们可以通过CSS轻松实现,但是如果我们动态的添加菜单,javascript的操作Dom将会变得很繁琐,我们可以应用组合模式来轻松实现。
组合模式用于把一组相似的对象当做一个单一的对象,以树形结构的形式来组合对象,以实现部分和整体的关系。下面的实例通过多级的伸缩菜单实现组合模式,其类图如下:
实现代码:
var Menu = Class.extend({ isLeaf:true, subMenu:[], label:‘菜单‘, href:‘#‘, ctor:function(_label,_href,_isLeaf = true,_subMenu = []){ this.isLeaf = _isLeaf; this.subMenu = _subMenu; this.label = _label; this.href = _href; }, addSubMenu:function(_menu){ this.subMenu.push(_menu); }, toString:function(){ var html = ‘‘; if(!this.isLeaf){ html += ‘<li onclick = "toggleMenu(this)"><a href = "‘ + this.href + ‘">‘+this.label + ‘</a>‘; html += "<ul class = ‘myHide‘>"; for (var i = 0;i < this.subMenu.length ; i++) { html += this.subMenu[i].toString(); } html += ‘</ul>‘; html += ‘</li>‘; }else{ html += ‘<li ><a href = "‘ + this.href + ‘">‘+this.label + ‘</a>‘; html += ‘</li>‘; } return html; } });
<body> <div id="navigation"> <ul id="listUL"> </ul> </div> </body> <script language="javascript"> function toggleMenu(obj){ window.event? window.event.cancelBubble = true : e.stopPropagation(); if(obj.childNodes[1].className == "myHide"){ obj.childNodes[1].className = ‘myShow‘; }else{ obj.childNodes[1].className = ‘myHide‘; } } (function(){ var Home = new Menu("Home","#"); var My = new Menu("My","#",false); var News = new Menu("News","#",false); var My_Info = new Menu("MyInfo",‘#‘,false); var Info_Detail = new Menu("InfoDetail",‘#‘,true); var My_Zone = new Menu("MyZone",‘#‘,true); My_Info.addSubMenu(Info_Detail); My.addSubMenu(My_Info); My.addSubMenu(My_Zone); console.log(document.getElementById("listUL")); document.getElementById("listUL").innerHTML = Home.toString() + My.toString(); })(); </script>
具体的样式可以下载源码查看,实现的效果如图(其实是三层菜单,修改代码可以实现区分开样式):
组合模式最大的缺点是违反了依赖倒置原则。
本文出自 “走一停二回头看三” 博客,请务必保留此出处http://janwool.blog.51cto.com/5694960/1882352
以上是关于iOS 动态树形结构 - 实现多级菜单,附带复选框功能的主要内容,如果未能解决你的问题,请参考以下文章