需求布景

想要参阅群众点评完结一个相似的多级菜单的功用,网上找了很久都没有找到适宜的,就自己着手完结了。一开始乍看之下觉得挺简略,但细写后发现里边的东西仍是挺丰厚的,所以记载下相似的完结思路供兄弟们参阅。

完结效果图

仿大众点评多级菜单实现

菜单规划思路

1. 处理数据源

一个比较重要的思想是不管几个列表,每一个cell都能够看成对应一个Model,整个菜单都以一个model进行规划。在这里我的整个模型规划为:

@interface JNLifeTransModel : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *idString;
@property (nonatomic, assign) BOOL selected;
@property (nonatomic, strong) NSString *longitude;
@property (nonatomic, strong) NSString *latitude;
@property (nonatomic, strong) NSMutableArray<JNLifeTransModel *> *transItems;
@end

这样规划能够考虑为,第一个列表中的每一个cell当它被选中时,都会取出其间对应的下一个列表,依次类推。在我的例子中,间隔/地铁其实对应的数据源一开始不是JNLifeTransModel,可是能够通用转化把相关的数据都处理为这个菜单对应的数据源。

2. 利用索引去进行选中和未选中的处理

当咱们处理一个列表其间某一个cell选中时,能够先遍历整个数据源将其设置为选中,然后根据点击的索引将选中的cell置为选中状况。

上述这种处理方式针对简略列表的完结当然是能够的,但这里地铁线路包含的数据量实际上是很大的,每一条线路都对应着许多的站点,利用循环的计划去解决问题在性能上是很低的,所以我采用了另一个比较好的计划便是记载当时用户的挑选,而且记载上一次用户的挑选。 我这里有三个tableView,用户每一个列表的选中实际上都对应着一个索引,比方挑选地铁1号线AAA这个选项时,其索引应该为(1,1,0),此刻如果用户挑选了地铁1号线BBB,那么索引为(1,1,1),上一个记载的索引为(1,1,0),咱们应该把当时的索引(1,1,1)置为选中,然后将上一次的(1,1,0)置为未选中,就能够完结咱们的需求。 索引的初始化比较重要,我的需求是当用户挑选间隔/地铁,默认选中间隔-不限,所以我的索引初始化为:

self.table1PreIndex = 0;
self.table2PreIndex = 0;
self.table3PreIndex = -1;
self.table1Index = 0;
self.table2Index = 0;
self.table3Index = -1;

-1表示列表为被选中,如果需求要求为默认选中地铁1号线AAA,那么此刻的初始化索引应该为:

self.table1PreIndex = 0;
self.table2PreIndex = 0;
self.table3PreIndex = -1;
self.table1Index = 1;
self.table2Index = 1;
self.table3Index = 0;

3. 关于列表选中的处理

关于某一个列表选中某一个cell时,此刻有一个比较重要的点在于对列表的改写判断。当我挑选间隔/地铁-地铁这个选项时,实际上我需求改写三个列表。当我挑选间隔/地铁-地铁-1号线时,实际上我需求改写第二和第三个列表,当我挑选间隔/地铁-地铁-1号线-AAA时,实际上我只需改写第三个列表。由于子列表的选中不会影响上级列表的改变,所以并不需求每一个列表都进行改写。

4. 关于回显的处理

关于回显的处理,需求注意的是,回显的时分不需求用到前一个选中的索引,只需求用户最后确认时的索引即可。 另一个或许引起许多问题的当地是,一定要注意关于重置选中cell的触发条件,在我的需求中,有几种状况会触发重置cell,分别是:选中第三个列表、接触布景区域让菜单栏消失、点击悉数类型按钮、点击间隔/地铁按钮,这四种状况都要重置用户上一个选中时的索引,这关于处理回显有很大的影响,其间只有用户挑选具体间隔(比方1KM)或挑选地铁-不限或某一个地铁站时,我才应该记载当时用户的选项,否则相似于点击布景区域让菜单栏消失,不应该再去记载当时用户的挑选,用户的挑选应该仍是停留在之前的选中状况。

总结

综上所述,我关于多级菜单的完结思路就能够分为下面几步:

  1. 数据源的处理
  2. 界说各列表选中和未选中的索引
  3. 选中某列表中的某个cell的处理
  4. 回显和影响重置前一个选中状况的条件处理

Demo地址

https://github.com/jniosdeveloper/DzdpMultiLevelMenuDemo