在工作中经常会遇到展开式tableview的处理,如何快速的完成一个合适的可展开的tableView,以及对展开cell上的视图事件进行处理对新手开发者是一个比较伤脑筋的问题。结合最近手头的一个项目,我来总结一个简单的可展开的tableView的实现方式
首先,一个标记状态是必不可少的
@property(nonatomic,assign)BOOL isExpand; //tableView是否打开标记
@property(nonatomic,assign)NSInteger SelectSection; //选择的是哪一个section
//以tableView的section和row相结合,section为外层,row为展开层,简单方便
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 4;
}
//在tableview的返回row的个数的代理方法中,处理isExpand的状态,在打开状态时返回需要的个数,你可以自定义一个数组来展示相应的数量
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//在这里,我们让tableview在打开时展示2个row,关闭时返回0
if (self.isExpand == YES && section == self.SelectSection) {
return 2;
}
else
return 0;
}
return 0;
}
//当tableView展开时,使用我们的自定义cell来填充
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if (self.isExpand == YES) {
self.dayChosCell = [tableView cellForRowAtIndexPath:indexPath];
self.dayChosCell.selectionStyle = UITableViewCellSelectionStyleNone;
self.dayChosCell.bigDicCellUseDic = self.bigMsgDic; //此处为自定义cell中所需要的数据,视个人情况传值
self.dayChosCell.selectWeek = [NSString stringWithFormat:@"%ld",self.SelectSection]; //把目前所点击的section也传进去
if (!self.dayChosCell)
{
//我重写了cell的初始化方法,传进了我所需要的两个数据
self.dayChosCell = [[ChooseDayTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DAYS"AndSelectWeek:[NSString stringWithFormat:@"%ld",self.SelectSection] AndDic:self.bigMsgDic];
self.dayChosCell.bigDicCellUseDic = self.bigMsgDic;
self.dayChosCell.frame = CGRectMake(0, 0, kWidth, [self tableView:self.PCDetailTableView heightForRowAtIndexPath:indexPath]);
self.dayChosCell.selectionStyle = UITableViewCellSelectionStyleNone;
//这里是方便cell内部视图点击事件的处理,使用了一个代理
self.dayChosCell.BtnSelectDelegate = self;
}
return self.dayChosCell;
}
else{
//当cell未展开时,返回nil
return nil;
}
return nil;
}
//不要忘了cell的返回高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 120;
}
//这里是建立section上的自定义View,由于我所需要的View比较简单,所以直接在这里创建了,也可以使用xib创建发咋的自定义view
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *viewForHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 60)];
UIButton *weekBtn = [UIButton buttonWithType:UIButtonTypeCustom];
weekBtn.frame = viewForHeader.frame;
weekBtn.tag = 556+section; //这里是随便加了一个数字,防止其他地方发生tag值相同的尴尬情况
[weekBtn addTarget:self action:@selector(WeekSelectAction:) forControlEvents:UIControlEventTouchDown];
//这里是UIButton的一个类目,方便了初始化btn之后复杂的设定,
[weekBtn setTitle:[NSString stringWithFormat:@"%@",self.weekArray[section]] andTitleState:UIControlStateNormal andFont:[UIFont fontWithName:@"Helvetica-Bold" size:14] andTitleColor:[UIColor colorWithHex:0x222222] andColorState:UIControlStateNormal andBgColor:[UIColor whiteColor] andRadius:0];
[viewForHeader addSubview:weekBtn];
return viewForHeader;
}
//设置section的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 60;
}
//为了美观,将footer设置为0,当然,需要footer时也可以设置
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0;
}
//由于我并不需要左滑编辑,所以我把编辑代理关掉了
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
//这是section上的btn的点击事件,由此控制isExpand的状态
-(void)WeekSelectAction:(UIButton *)sender{
if (self.isExpand == NO) {
self.isExpand = YES;
sender.selected = YES;
self.SelectSection = sender.tag - 556;
//只需要重载tableview,不需要insert或者delete,绕过了新手头疼的数组越界问题
[self.whichWeekView.weekTableView reloadData];
}
else
{
self.isExpand = NO;
sender.selected = NO;
self.SelectSection = sender.tag;
[self.whichWeekView.weekTableView reloadData];
}
}
这样就可以简单的完成一个可以展开收起的tableview了,对于展开cell上的事件处理,我们下一篇见。