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

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

通过判断新老数据的数量, 已经对应的位置, 进行删除和插入操作, 就可以添加对应的动画效果

此时, 效果如下:

 

 

iOS,N级下拉菜单,下拉菜单,制作下拉菜单,UITableView

第八步, 选项的选中效果

我在cell的左半部分添加了一个半个cell宽的透明按钮, 并设置了一个代理方法

当点击透明按钮时, 调用代理方法, 修改cell对应的 LTMenuItemisSelected 的值, 来控制选中状态

在控制器中指定代理, 并实现代理方法


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  LTMenuItemCell *cell = [tableView dequeueReusableCellWithIdentifier:LTMenuItemId forIndexPath:indexPath];
  cell.menuItem = self.latestShowMenuItems[indexPath.row];
  cell.delegate = self;
  return cell;
}

#pragma mark - < LTMenuItemCellDelegate >

- (void)cell:(LTMenuItemCell *)cell didSelectedBtn:(UIButton *)sender
{
  cell.menuItem.isSelected = !cell.menuItem.isSelected;
  [self.tableView reloadData];
}

效果如下:

 

 
iOS,N级下拉菜单,下拉菜单,制作下拉菜单,UITableView 

 

第九步, 使用递归进行 全选和反选 操作

首先我们在导航条右侧添加 全选 按钮, 并实现对应的点击方法


#pragma mark - < 点击事件 >

- (void)allBtnClick:(UIButton *)sender
{
  sender.selected = !sender.selected;
  
  [self selected:sender.selected menuItems:self.menuItems];
}


/**
 取消或选择, 某一数值中所有的选项, 包括子层级

 @param selected 是否选中
 @param menuItems 选项数组
 */
- (void)selected:(BOOL)selected menuItems:(NSArray<LTMenuItem *> *)menuItems
{
  for (int i = 0; i < menuItems.count; i++) {
    LTMenuItem *menuItem = menuItems[i];
    menuItem.isSelected = selected;
    if (menuItem.isCanUnfold) {
      [self selected:selected menuItems:menuItem.subs];
    }
  }
  [self.tableView reloadData];
}

上述的第二个方法, 就是修改对应数组中所有的数据及子集的选中状态

同时修改该cell的代理方法 - (void)cell:(LTMenuItemCell *)cell didSelectedBtn:(UIButton *)sender 的实现


#pragma mark - < LTMenuItemCellDelegate >

- (void)cell:(LTMenuItemCell *)cell didSelectedBtn:(UIButton *)sender
{
  cell.menuItem.isSelected = !cell.menuItem.isSelected;
  // 修改按钮状态
  self.allBtn.selected = NO;
  [self.tableView reloadData];
}