UITableView 是iOS中最重要的控件,几乎所有的页面都可以用UITableView完成。
基本用法:
tableView的使用需要遵循代理和数据源,这也是一种非常棒的设计模式,数据源模式可以近似为代理模式。
// 基本属性
// 设置tableView的类型
// UITableViewStylePlain 基本类型,分区头标题会悬浮
// UITableViewStyleGrouped 分组的类型,分区头标题不会悬浮
UITableView *tableView = [[UITableView alloc] initWithFrame:
CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:(UITableViewStyleGrouped)];
// 设置背景
tableView.backgroundColor = [UIColor whiteColor];
// 设置分割线的类型
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// 设置分割线颜色
tableView.separatorColor = [UIColor blackColor];
// 设置分割线的位置
tableView.separatorInset = UIEdgeInsetsMake(0, 20, 0, 20);
// 数据源和代理
tableView.dataSource = self;
tableView.delegate = self;
self.tableView = tableView;
[self.view addSubview:self.tableView];
设置数据源方法和代理方法:
// 数据源方法
@protocol UITableViewDataSource<NSObject>
@required // 必须实现的方法
// 每个section有多少rows
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
// 设置cell的详情,需要用到的重要概念,cell的重用机制
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@optional //可选的实现方法
// 设置section的数量,默认为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
// section由两部分组成,header和footer,分别设置各自需要展示的字符串,也可以自定义显示的样式,需要用到其他的方法
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
// Editing 编辑需要用到的方法
// 哪些row可以被编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
// Moving/reordering 移动
// 哪些row可以被移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
// Index
// 设置索引
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView __TVOS_PROHIBITED; // return list of section titles to display in section index view (e.g. "ABCD...Z#")
// 设置索引的响应
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index __TVOS_PROHIBITED; // tell table which section corresponds to section title/index (e.g. "B",1))
// Data manipulation - insert and delete support 删除和插入实现的方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
// Data manipulation - reorder / moving support 移动实现的方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
@end
查看代理的方法:
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
@optional // 可选的常用的方法
// 设置对应的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
// 自定义header和footer
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
// 设置编辑的样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
// 移动or排序
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;
@end