iOS开发使用UITableView制作N级下拉菜单的示例

2020-01-21 04:20:41王振洲

此时我们只需要控制 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];
    }
  }
}