此时我们只需要控制 latestShowMenuItems 中包含的数据, 就可以控制页面的展示, 而 menuItems 中的数据不需要增加和减少
第五步, 控制 latestShowMenuItems 中数据的方法
现在, latestShowMenuItems 中没有数据, 所以界面初始化后将不会展示任何数据
我们接下来就在 latestShowMenuItems 中添加初始化界面时需要展示的数据, 并设置层级为0
- (void)setupRowCount
{
// 添加需要展示项, 并设置层级, 初始化0
[self setupRouCountWithMenuItems:self.menuItems index:0];
}
/**
将需要展示的选项添加到latestShowMenuItems中
*/
- (void)setupRouCountWithMenuItems:(NSArray<LTMenuItem *> *)menuItems index:(NSInteger)index
{
for (int i = 0; i < menuItems.count; i++) {
LTMenuItem *item = menuItems[i];
// 设置层级
item.index = index;
// 将选项添加到数组中
[self.latestShowMenuItems addObject:item];
}
}
第六步, 通过tableView代理中cell的点击方法, 处理菜单的展开闭合操作
通过 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 方法, 处理菜单的展开闭合操作
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 取出点击的选项
LTMenuItem *menuItem = self.latestShowMenuItems[indexPath.row];
// 判断是否能够展开, 不能展开立即返回, 不错任何处理
if (!menuItem.isCanUnfold) return;
// 设置展开闭合
menuItem.isUnfold = !menuItem.isUnfold;
// 刷新列表
[self.tableView reloadData];
}
在这里, 根据被点击数据能否展开, 修改了对应的 isUnfold 属性, 并刷新界面
但此时由于 latestShowMenuItems 中数据没有数量变化, 所以子层级并不能显示出来
所以我们需要对 latestShowMenuItems 中的数据进行修改
我们在这里修改第五步中的两个方法, 如下所示
#pragma mark - < 添加可以展示的选项 >
- (void)setupRowCount
{
// 清空当前所有展示项
[self.latestShowMenuItems removeAllObjects];
// 重新添加需要展示项, 并设置层级, 初始化0
[self setupRouCountWithMenuItems:self.menuItems index:0];
}
/**
将需要展示的选项添加到latestShowMenuItems中, 此方法使用递归添加所有需要展示的层级到latestShowMenuItems中
@param menuItems 需要添加到latestShowMenuItems中的数据
@param index 层级, 即当前添加的数据属于第几层
*/
- (void)setupRouCountWithMenuItems:(NSArray<LTMenuItem *> *)menuItems index:(NSInteger)index
{
for (int i = 0; i < menuItems.count; i++) {
LTMenuItem *item = menuItems[i];
// 设置层级
item.index = index;
// 将选项添加到数组中
[self.latestShowMenuItems addObject:item];
// 判断该选项的是否能展开, 并且已经需要展开
if (item.isCanUnfold && item.isUnfold) {
// 当需要展开子集的时候, 添加子集到数组, 并设置子集层级
[self setupRouCountWithMenuItems:item.subs index:index + 1];
}
}
}










