在创建tableView时,有时候需要加载好多种不同样式的自定义cell,这时候根据indexPath.section = 0、1、2、3、4,这样不能满足服务器数据的动态变化是小事,关键显得自己特别的初级。
那么应该如何动态根据服务器返回的数据渲染对应的自定义cell呢?咱一步一步来。
- 首先numberOfSectionsInTableView里一如既往;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return arr.count;
}
- numberOfSectionsInTableView里一如既往;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return subArray.count;
}
- heightForRowAtIndexPath里;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
BBmodle * modle = arr[indexPath.section];
if ([modle.key isEqualToString:@"cell1"]) {
return 90;
}else if([modle.key isEqualToString:@"cell2"]){
return 78;
}else if([modle.key isEqualToString:@"cell3"]){
return 114;
}
return 0;
}
- cellForRowAtIndexPath里;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
BBmodle * modle = arr[indexPath.section];
if ([modle.key isEqualToString:@"cell1"]) {
//cell1
XXCell1 *cell = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
if (!cell) {
cell = [[XSWorkTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell1"];
}
return cell;
}else if([modle.key isEqualToString:@"cell2"]){
//cell2
XXCell2 *cell = [tableView dequeueReusableCellWithIdentifier:@"cell2"];
return cell;
}else if([modle.key isEqualToString:@"cell3"]){
//cell3
XXCell3 *cell = [tableView dequeueReusableCellWithIdentifier:@"cell3"];
if (!cell) {
cell = [[XSAreaSevTableViewCell alloc]init];
}
return cell;
}
return [UITableViewCell new];
}
说明:arr 里装BBmodle模型,BBmodle模型中包含一个key,对应模型的唯一标识,亦或者对应cell的样式标识;还包含一个subArray,这个模型下的数组。
如此以来,我们大可以直接加载服务器返回的所有数据,而不用去管数组的顺序变化、以及数量变化了。是不是代码逻辑清晰了很多,而且一劳永逸。
大概样式及效果: