刚开始学习tableView的时候,一直以为一个页面只能有一个tableView,后来,当接触到要在一个页面建立多个tableView时候,才发现自己是多么的OUT了!下面就一个界面建立多个tableView相关联(以省市区为例)进行一个简要的分析:
在这之前,我先在工程上添加了一个自己准备好的txt格式的文本:
//下面的方法全部在根视图下进行,同时系统为MRC:
//1.第一步:声明定义属性:
@property(nonatomic, retain)NSMutableArray *dataProArray;
@property(nonatomic, retain)NSMutableArray *dataCityArray;
@property(nonatomic, retain)NSMutableArray *dataZoneArray;
@property(nonatomic, retain)UITableView *proTableView;
@property(nonatomic, retain)UITableView *cityTableView;
@property(nonatomic, retain)UITableView *zoneTableView;
//2.第二步:由于是MRC模式下,需要做dealloc释放操作:
- (void)dealloc
{
[_dataProArray release];
[_dataZoneArray release];
[_dataCityArray release];
[_proTableView release];
[_cityTableView release];
[_zoneTableView release];
[super dealloc];
}
//3.第三步:需要对传入的txt文件,进行解析:
NSString *string = [NSString stringWithContentsOfFile:@"/Users/dllo/Desktop/省市区的选择/省市区的选择/area.txt" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [string componentsSeparatedByString:@"\n"];
self.dataProArray = [NSMutableArray array];
self.dataZoneArray = [NSMutableArray array];
self.dataCityArray = [NSMutableArray array];
for (NSString *str in array) {
if (![str hasPrefix:@" "]) {
//创建省的字典:(包含一个省的完整信息)
NSMutableDictionary *proDic = [NSMutableDictionary dictionary];
//设置省名字的键值对:
[proDic setObject:str forKey:@"proName"];
//创建对应该省的城市数组:
NSMutableArray *cityArray = [NSMutableArray array];
[proDic setObject:cityArray forKey:@"cityArray"];
//添加省的字典
[self.dataProArray addObject:proDic];
}
else if (![str hasPrefix:@" "])
{
//取出存放的省字典:
NSMutableDictionary *proDic = [self.dataProArray lastObject];
//创造当前城市的字典:
NSMutableDictionary *cityDic = [NSMutableDictionary dictionary];
//获取当前城市的数组:
NSMutableArray *cityArray = [proDic valueForKey:@"cityArray"];
//创建城市名字的键值对:
[cityDic setObject:str forKey:@"cityName"];
//创建该城市的数组键值对:
NSMutableArray *zoneArray = [NSMutableArray array];
[cityDic setObject:zoneArray forKey:@"zoneArray"];
//添加
[cityArray addObject:cityDic];
}
else
{
//取出存放的省字典:
NSMutableDictionary *proDic = [self.dataProArray lastObject];
//获取城市所在的数组:
NSMutableArray *cityArray = [proDic objectForKey:@"cityArray"];
//获取城市字典:
NSMutableDictionary *cityDic = [cityArray lastObject];
//把当前的区数组取出:
NSMutableArray *zoneArray = [cityDic objectForKey:@"zoneArray"];
//添加:
[zoneArray addObject:str];
}
}
//4.第四步:初始化tableView并注册对应的cell以及签订协议,制定协议代理人:
//初始化省的proTableView:
self.proTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width / 3.0, self.view.frame.size.height - 20) style:UITableViewStylePlain];
self.proTableView.delegate = self;
self.proTableView.dataSource = self;
[self.view addSubview:_proTableView];
[_proTableView release];
//初始化市的cityTableView
self.cityTableView = [[UITableView alloc] initWithFrame:CGRectMake(self.view.frame.size.width / 3.0, 20, self.view.frame.size.width / 3.0, self.view.frame.size.height - 20) style:UITableViewStylePlain];
self.cityTableView.delegate = self;
self.cityTableView.dataSource = self;
[self.view addSubview:_cityTableView];
[_cityTableView release];
//初始化区的zoneTableView
self.zoneTableView = [[UITableView alloc] initWithFrame:CGRectMake(self.view.frame.size.width / 3.0 * 2.0, 20, self.view.frame.size.width / 3.0, self.view.frame.size.height - 20) style:UITableViewStylePlain];
self.zoneTableView.delegate = self;
self.zoneTableView.dataSource = self;
[self.view addSubview:_zoneTableView];
[_zoneTableView release];
//注册cell
[self.proTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"proCell"];
[self.cityTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cityCell"];
[self.zoneTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"zoneCell"];
//5.第五步:代理方法的实现:
//(1)设置cell的数量(必须实现方法):
因为我们有三个tableView,所以要考虑不同的tableView需要对应不同的cell数量值:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//判断当前所点击的表视图tableView是哪一个:
if (tableView == _proTableView) {
return self.dataProArray.count;
}
else if (tableView == _cityTableView)
{
return self.dataCityArray.count;
}
else
{
return self.dataZoneArray.count;
}
}
//(2)设置cell的内容(必须实现方法):
我们也要考虑到不同的tableView所对应的每个cell的内容是不同的,固然需要进行一次if的判断:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//判断当前表视图tableView是哪个表视图
if (tableView == _proTableView) {
//创建对应的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"proCell"];
//获取到当前所点击的省字典
NSMutableDictionary *proDic = [self.dataProArray objectAtIndex:indexPath.row];
//给省表视图中的cell.textLabel.text赋值
cell.textLabel.text = [proDic objectForKey:@"proName"];
cell.textLabel.font = [UIFont systemFontOfSize:13];
return cell;
}
else if (tableView == _cityTableView)
{
//创建对应的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cityCell"];
//获取到当前所点击的城市字典
NSMutableDictionary *cityDic = [self.dataCityArray objectAtIndex:indexPath.row];
//给城市表视图中的cell.textLabel.text赋值:
cell.textLabel.text = [cityDic objectForKey:@"cityName"];
cell.textLabel.font = [UIFont systemFontOfSize:13];
return cell;
}
else
{
//创建对应的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"zoneCell"];
//给区的表视图中的cell.textLabel.text赋值:
cell.textLabel.text = [self.dataZoneArray objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont systemFontOfSize:13];
return cell;
}
}
(3)设置点击方法:
为了满足当点击省表视图中的省时,在市的表视图中显示对应的省里的市名单(同点击市,显示区名单), 我们添加一个tableView的点击方法:
由于不同点击不同的表视图,固然我们也要进行一次if的判断,到底点击的是哪一个表视图:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//判断当前所点击的表视图是哪个
if (tableView == _proTableView) {
//获取当前点击的哪个省:
NSMutableDictionary *proDic = [self.dataProArray objectAtIndex:indexPath.row];
//获取当前省对应的城市数组:
NSMutableArray *cityArray = [proDic objectForKey:@"cityArray"];
//为城市数据源赋值:
self.dataCityArray = cityArray;
//刷新城市视图
[self.cityTableView reloadData];
}
else if (tableView == _cityTableView) {
//获取到当前所点击的城市
NSMutableDictionary *cityDic = [self.dataCityArray objectAtIndex:indexPath.row];
//获取到具体的区数组,给区数据源赋值:
NSMutableArray *zoneArray = [cityDic objectForKey:@"zoneArray"];
self.dataZoneArray = zoneArray;
//刷新区视图:
[self.zoneTableView reloadData];
}
}
//最后给大家呈现一下系统模拟器iPhone 6s下程序的效果图:
//(1)刚运行程序,没有点击时的样式:
//(2)当点击一个省时的样式:
//(3)当点击一个市时的样式:
注:文件解析时,只想把省市区的样式给大家展示出来,没有将number给减去,请读者见谅!!想要去掉数字的方法:文本和数字之间有一个空格,当你取出每一个对应的数据时,可以添加一个[string componentsSeparatedByString:@" "]的方法获取一个数组!我们所需要的数据源是数组中的第一个元素!这只是一个简要的分析,如果有更好的方法,读者可以给我评论留言,感谢!!!
//添加内容:
去掉数字的代码:
最终的效果图: