美文网首页iOS
【iOS开发-60】案例学习:多组数据的tableView设置、

【iOS开发-60】案例学习:多组数据的tableView设置、

作者: xiaomayi2012 | 来源:发表于2016-08-28 15:58 被阅读601次

    转至:http://blog.csdn.net/weisubao/article/details/40300163?utm_source=tuicool&utm_medium=referral

    效果如下:

    这里的数据模型有两层:每一组汽车是一层模型,每一组里面的每一行汽车品牌也是一层模型。

    (1)我们先创建一个WSCars模型。

    在WSCars.h中:

    #import

    @interfaceWSCars : NSObject

    @property(nonatomic,copy)NSString*icon;

    @property(nonatomic,copy)NSString*name;

    +(WSCars*)carsWithDict:(NSDictionary*)dict;

    -(WSCars*)initWithDict:(NSDictionary*)dict;

    @end

    在WSCars.m中:

    #import "WSCars.h"

    @implementationWSCars

    +(WSCars*)carsWithDict:(NSDictionary*)dict{

    return[[selfalloc]initWithDict:dict];

    }

    -(WSCars*)initWithDict:(NSDictionary*)dict{

    if([superinit]) {

    [selfsetValuesForKeysWithDictionary:dict];

    }

    returnself;

    }

    @end

    (2)再创建一个汽车组模型,WSCarGroup。

    在WSCarGroup.h中:

    #import  <Foundation/Foundation.h>

    @interfaceWSCarGroup : NSObject

    @property(nonatomic,copy)NSString* title;

    @property(nonatomic,strong)NSArray*cars;

    +(WSCarGroup*)carGroupWithDict:(NSDictionary*)dict;

    -(WSCarGroup*)initWithDict:(NSDictionary*)dict;

    @end

    在WSCarGroup.m中:(此处做了1次字典转模型,即把每个汽车数据转成WSCars对象)

    #import "WSCarGroup.h"

    #import "WSCars.h"

    @implementationWSCarGroup

    +(WSCarGroup*)carGroupWithDict:(NSDictionary*)dict{

    return[[selfalloc]initWithDict:dict];

    }

    -(WSCarGroup*)initWithDict:(NSDictionary*)dict{

    if([superinit]) {

    self.title=dict[@"title"];

    NSArray*dictArray=dict[@"cars"];

    NSMutableArray*muArray=[[NSMutableArrayalloc]init];

    for(NSDictionary* dic in dictArray) {

    WSCars*car=[[WSCarsalloc]initWithDict:dic];

    [muArrayaddObject:car];

    }

    self.cars=muArray;

    }

    returnself;

    }

    @end

    (3)然后在ViewController.m中,定义数组,并且把字典转模型

    @property (nonatomic,strong) NSArray *carsArray;

    //字典转模型

    - (NSArray *)carsArray{

    if (_carsArray==nil) {

    NSString *path=[[NSBundle mainBundle]pathForResource:@"cars_total.plist" ofType:nil];

    NSArray *totalArray=[NSArray arrayWithContentsOfFile:path];

    NSMutableArray *muArray=[[NSMutableArray alloc]init];

    for (NSDictionary *dict in totalArray) {

    WSCarGroup *carGroup=[[WSCarGroup alloc]initWithDict:dict];

    [muArray addObject:carGroup];

    }

    _carsArray=muArray;

    }

    return _carsArray;

    }

    数组工作至此完成。

    (4)拖拽一个tableView,并且定义成变量。这个控制器被当成数据源,所以遵守协议。

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UITableView *tableView;

    @end

    (5)并且把数据源设置成当前控制器,顺便设置一下行高

    - (void)viewDidLoad {

    //设置数据源

    self.tableView.dataSource=self;

    //设置行高

    self.tableView.rowHeight=60;

    [super viewDidLoad];

    }

    (6)设置tableView的组、行和cell数据和组名字。

    //设置多少组

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return self.carsArray.count;

    }

    //设置多少行

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    WSCarGroup *carGroup=self.carsArray[section];

    return carGroup.cars.count;

    }

    //设置cell内容

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //先缓存池,性能优化

    static NSString *ID=@"car";

    UITableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:ID];

    if (cell==nil) {

    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];

    }

    //取出数据

    WSCarGroup *carGroup=self.carsArray[indexPath.section];

    WSCars *cars=carGroup.cars[indexPath.row];

    //赋值给cell

    cell.textLabel.text=cars.name;

    cell.imageView.image=[UIImage imageNamed:cars.icon];

    return cell;

    }

    //设置组名

    -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    WSCarGroup *carGroup=self.carsArray[section];

    return carGroup.title;

    }

    (7)设置组索引

    -(NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView{

    //需要返回一个数组

    //用valueForKey只能在本层级字典中查找,而self.carsArray是数组,且没有title关键字

    //用valueForKeyPath可以在本级及下级字典数组中查找,有path路径

    return[self.carsArrayvalueForKeyPath:@"title"];

    }

    (8)为方便展示观看:

    //隐藏状态栏

    -(BOOL)prefersStatusBarHidden{

    return YES;

    }

    总结:

    ——难度在于字典转模型的地方,因为模型有2层级。

    ——增加了一个知识点,即显示组索引。用sectionIndexTitlesForTableView方法,返回值是一个数组,所以我们这里也用到了valueForKeyPath这个方法取得一个字符串组。

    相关文章

      网友评论

        本文标题:【iOS开发-60】案例学习:多组数据的tableView设置、

        本文链接:https://www.haomeiwen.com/subject/riujhttx.html