需要做一个列表展开功能,先分析一下思路。
1.列表展开需要设置tableVbiew的类型是 “组” 类型
2.数据源的数据结构应该是需要满足分组需求的。比如有多组数据
3.有一个数组,里面的元素需要和数据源数组中的元素一样多,用来控制刷新哪一组数据源
4.原理就是:判断当前点击的是哪一组section,然后刷新这一组的数据,而且返回的cell高度为0或者cell的总体高度,这样就可以满足展开和合并这个功能。
这里我觉得可以让后台返回一个字段,在每一组数据中都存在,然后在本地解析存到一个数组中,作为判断section当前展开或者合并的状态。
还有一种就是获取到数据源数组中有多少组元素,然后依次向一个数组里面添加对应个数的元素进去,然后用来判断section的合并和展开。
1.构建一个数据源数组
#pragma 数据源数组 构建一个数据源数组sectionArr
-(void)makeSuoreArray
{
self.sectionArr = [NSMutableArray array];
self.indexRowArr = [NSMutableArray array];
for (int i = 0; i < 6; i++) {
//添加每一组cell
NSMutableArray *cellArr = [NSMutableArray array];
for(int j = 0; j < arc4random()%10 + 1; j ++){
NSString * cellStr = [NSString stringWithFormat:@"第%d行cell",j];
[cellArr addObject:cellStr];
}
[self.sectionArr addObject:cellArr];
[self.indexRowArr addObject:@"0"];
}
NSLog(@"%@",self.sectionArr);
}
2.给section添加点按手势
//添加手势 (在section中添加了一个label,然后给label添加的手势)
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openlist:)];
[sectionHeardLabel addGestureRecognizer:tap];
3.实现点按手势的监听方法,用来控制列表的展开和合并
这个方法里面主要就是刷新列表,重点是制定刷新哪一组的哪些cell,所以第一步需要获取到对应的scetion和对应的cell,然后再判断当前section的状态来控制刷新列表,然后返回不同的cell高度。
#pragma 手势
-(void)openlist:(UITapGestureRecognizer *)tap
{
NSLog(@"我点击了%ld行",tap.view.tag);
int index = tap.view.tag % 10;
NSMutableArray *indexArray = [NSMutableArray array];
NSArray *arr = self.sectionArr[index];
for (int i = 0; i < arr.count; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:index];
[indexArray addObject:indexPath];
}
if ([self.indexRowArr[index] isEqualToString:@"0"]) {
self.indexRowArr[index] = @"1";
[self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationBottom];
}else
{
self.indexRowArr[index] = @"0";
[self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationTop];
}
}
4.cell高度的返回
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if([self.indexRowArr[indexPath.section] isEqualToString:@"0"])
{
return 0;
}else{
return 64;
}
}