UITableView初始化:表格控件在创建时,必须指定style.
UITableView的分以下为两种
UITableViewStylePlain:平板格式
UITableViewStyleGrouped:分组格式
1 - (UITableView *)tableView 2 { 3 if (_tableView == nil) { 4 // 表格控件在创建时,必须指定style 5 _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 6 7 _tableView.dataSource = self; // 数据源方法 8 _tableView.delegate = self; // 代理方法 9 10 [self.view addSubview:_tableView]; 11 12 } 13 return _tableView; 14 }
UITableView的数据源方法:
必须加上_tableView.dataSource = self;这句代码,并且遵守UITableViewDataSource协议才能使用数据源方法。
数据源协议中以下两个方法是@required必须实现
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
作用:返回每一个分组的数据总数,可以根据section得到每一个分组的总数,如下:
1 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 2 { 3 // 找到group 4 CarGroup *group = self.carGroups[section]; 5 return group.title; 6 }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
作用:告诉表格控件,每一行cell单元格的细节,如下:
1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2 { // 可重用标示符 3 NSString *ID = @"Cell"; 4 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 在缓存池中查找 5 6 // 如果没有找到,就创建一个 7 if (cell == nil) { 8 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; 9 } 10 11 // 设置cell内容 12 // 1> 取出数据模型 13 CarGroup *group = self.carGroups[indexPath.section]; 14 Car *car = group.cars[indexPath.row]; 15 // 2> 设置数据 16 cell.imageView.image = car.image; 17 cell.textLabel.text = car.name; 18 19 return cell; 20 }
参数(NSIndexPath *)indexPath里面包含两个信息<section, row>,其中section是当前cell所在的组数,row是行数。
初始化cell的时候先利用ID在缓存池中查找是否有可重用的cell,如果有继续,没有就创建一个,创建时;
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
其中reuseIdentifier:ID 是为了下次使用cell时,方便在缓存池中查找。
initWithStyle:UITableViewCellStyleSubtitle,cell的Style分为以下四种:
UITableViewCellStyleDefault, 默认类型 标题 + 可选图像
UITableViewCellStyleValue1, 标题 + 明细(在标题后面) + 图像
UITableViewCellStyleValue2, 不显示图像,标题 + 明细
UITableViewCellStyleSubtitle 标题 + 明细(在标题下面) + 图像
其中cell的右侧可以设置,,利用cell的accessoryType,在上面方法中设置,例如:
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell的accessoryType分为以下四种:
1> UITableViewCellAccessoryDisclosureIndicator: 箭头,可以提示用户当前行是可以点击的,通常选中行回跳到新的页面
2> UITableViewCellAccessoryCheckmark: 对号,提示用户该行数据设置完毕,使用的比较少
3> UITableViewCellAccessoryDetailButton: 按钮,通常点击的按钮可以做独立的操作,不会影响行的选中,例如alertView
4> UITableViewCellAccessoryDetailDisclosureButton: 按钮+箭头,各自操作,按钮不会影响行的选中
通常 accessoryType提供的类型不能满足时,才会使用自定义控件,但是需要自行添加监听方法,通常用在自定义cell,不要写在视图控制器中,自定义控件的事件触发同样不会影响表格行的选中,例如添加UISwitch,但监听事件需要自行添加。
1 // 右侧指定自定义视图 2 UISwitch *switcher = [[UISwitch alloc] init]; 3 [switcher addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged]; 4 cell.accessoryView = switcher;
运行效果:
当右侧按钮不是自定义的时候,右侧按钮的监听方法如下,即需要实现下面的数据源方法
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
其他几个常用的数据源方法如下:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; //作用:返回分组总数
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; // 设置每组的标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section; // 设置分组的描述,底部文字
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;// 设置右侧的索引列表
1 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 2 { 3 return [self.carGroups valueForKeyPath:@"title"]; 4 }
如图:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;// 选中某一行是触发
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath; // 取消选中某一行时触发
UITableView的代理方法:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; // 设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; // 设置标题高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; // 设置底部高度
其中行高也可以用_tableView.rowHeight = 100设置,以下对比
_tableView.rowHeight: 效率高,适用于所有的行高一致
代理方法指定行高: 效率差,适合于每一个行高不一样,能够让表格更加灵活。