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

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

前言

demo地址:  https://www.easck.com/file_images/article/201801/201801231012004.gif" />

 

其中每一个UITableViewCell左右两部分拥有不同的功能

    左半部分我放了一个按钮, 用来控制每个选项的选中状态 右半部分控制菜单的展开和闭合

下面是我在做这个功能时的思路, 使用的是MVC

创建控制器, 并添加数据

第一步, 创建一个新的项目, 并添加几个类

LTMenuItemViewController: 继承自UITableViewController, 多层菜单界面

LTMenuItem: 继承自 NSObject, 多层菜单的选项模型, 其中有两个属性

     name : 选项的名称 subs : 选项的子层级数据

#import <Foundation/Foundation.h>

@interface LTMenuItem : NSObject
/** 名字 */
@property (nonatomic, strong) NSString *name;
/** 子层 */
@property (nonatomic, strong) NSArray<LTMenuItem *> *subs;
@end

LTMenuItemCell: 继承自: UITableViewCell, 多层菜单的选项cell 添加数据源文件, 存放的就是需要展示的菜单数据, 项目中应从网络中获取, 这里为了方便, 使用文件的形式

 第二步, 在LTMenuItemViewController中, 设置tableView的数据源和cell

效果图如下:

 

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

 

具体代码如下, 其中数组转模型使用的第三方库 MJExtension


#import "LTMenuItemViewController.h"
#import "LTMenuItem.h"
#import "LTMenuItemCell.h"
#import <MJExtension/MJExtension.h>

@interface LTMenuItemViewController ()

/** 菜单项 */
@property (nonatomic, strong) NSMutableArray<LTMenuItem *> *menuItems;

@end

@implementation LTMenuItemViewController

static NSString *LTMenuItemId = @"LTMenuItemCell";

- (void)viewDidLoad {
  [super viewDidLoad];
  
  [self setup];
  
  [self setupTableView];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

#pragma mark - < 基本设置 >

- (void)setup
{
  self.title = @"多级菜单";
  
  NSString *filePath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"plist"];
  NSArray *date = [NSArray arrayWithContentsOfFile:filePath];
  self.menuItems = [LTMenuItem mj_objectArrayWithKeyValuesArray:date];

  self.tableView.separatorStyle = UITableViewCellSelectionStyleNone;
  self.tableView.rowHeight = 45;
  [self.tableView registerClass:[LTMenuItemCell class] forCellReuseIdentifier:LTMenuItemId];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return self.menuItems.count;
}

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