一、简单介绍
在同一个界面有两个或者三个TableView,点击前一个TableView后一个TableView的内容相对应的发生改变.
TableView的联动的原理是,点击第一个TableView,改变第二个TableView的数据源,刷新第二个TableView,其中容易迷糊的就是,数据源的转换,难点就是判断
我自己写了两个工程实例,一个是省市区的三重联动,一个是中关村在线APP的其中一个页面,是二重联动
这里我主要是介绍中关村在线的联动界面的做法,省市区的我原先写过博客介绍,前点击这里.
二、中关村在线的联动界面
中关村在线的联动界面(以下简称为:联动界面) 主要难的地方在解数据,其实联动的思想不难,建议先看省市区,不然可能会被里面的数据绕晕.里面有两段关键代码,我一一介绍
下面这一段代码是难点.这段代码是写在TableView的点击方法里,当点击了左边的TableView的内容时候就会请求对应的数据.数据主体有两部分组成,两个字典一个是热卖的,另一个就是按照0-9 A-Z 的数据,但是数据本身不是数组,而是字典,所以我们需要对这些数据排序,这样就麻烦了.这就让问题的难度呈指数增长了.我没有使用传统的冒泡排序什么的排序方法排序,我是在一个数组中将0-9 A-Z放在里面,然后对这个数组遍历,然后一数组中的元素,也就是0-9A-Z中的一个,为key值去请求的数据的字典中获得value,如果有值就保存到数组中,没有就当前的元素()也删除掉
// 请求数据,获得当前主视图多所对应的副视图的数据
[NetWorkingTool netWorkingWithStrURL:strURL block:^(id result) {
self.rankArr = result[@"rank"];
self.abcDic = result[@"abc"];
self.deputyArr = [NSMutableArray array];
self.sectionCountArr = [NSMutableArray array];
// 添加元素
[self.deputyArr addObjectsFromArray:self.rankArr];
// 添加当前区里的行数
[self.sectionCountArr addObject:[NSString stringWithFormat:@"%ld",self.rankArr.count]];
// 分区的标题数组
self.sectionTitleArr = [NSMutableArray arrayWithObjects:@"热",@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z", nil];
// 遍历所有的数据
for(NSInteger i = 1; i < self.sectionTitleArr.count; i++){
// 将当前字典中的数据添加到数组中,同时让所有的数据,有序的排列
NSArray *tempArr = [self.abcDic objectForKey:self.sectionTitleArr[i]];
if(tempArr.count == 0){
// 将没有数据的分区移除
[self.sectionTitleArr removeObjectAtIndex:i];
i -= 1;
}
else{
// 将有数据的分区添加到副视图保存数据的数组中
[self.deputyArr addObjectsFromArray:tempArr];
// 保存当前分区的数据的个数
[self.sectionCountArr addObject:[NSString stringWithFormat:@"%ld",tempArr.count]];
}
}
//
[self.deputyTableView removeFromSuperview];
[self createDeputyTableView];
self.mainTableView.frame = CGRectMake(0, 64, Width / 3, Height - 64);
[self.deputyTableView reloadData];
}];
下面这一段代码是另一个难点,这段代码是写在TableViewCell的创建的协议方法里是为了获得当前的分区中的当前的Cell的内容,因为TableView是按照分区显示的但是数组中的数据不是按照分区存储的,所以需要获得当前的TableView的Cell所对应的数据在数组中的位置,下面这一段代码就完成了这项工作
// 找到当前的Cell在副视图数组中的位置
NSInteger index = 0;
for(NSInteger i = 0; i < indexPath.section ; i++){
index += [self.sectionCountArr[i] integerValue];
}
index += indexPath.row;
三、效果图
联动界面
四、工程地址