UITableView使用详解
普通属性
style
是UITableViewStyle
两种风格,默认是UITableViewStylePlain
即使是默认也都可以通过代码修改
UITableViewStylePlain //如果有多组,每组标题会置顶悬浮
UITableViewStyleGrouped //如果有多组,每组之间会有间隔
rowHeight
,sectionHeaderHeight
,sectionFooterHeight
分别是cell的统一的行高,每组的表头高度,每组的表尾高度;不设置就是默认是UITableViewAutomaticDimension
,可以通过下面方法单独设置每组/每行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
estimatedRowHeight
,estimatedSectionHeaderHeight
,estimatedSectionFooterHeight
估算行高度,每组表头的估算高度,每组表尾的估算高度;默认是UITableViewAutomaticDimension
,设置为0代表关掉不用这些属性
默认情况下(这三个属性值不为0),每次刷新系统会在cell显示出屏幕的时候调用:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
如果关掉(设置为0),每次刷新有多少cell三个方法就会调用多少次
separatorInset
默认cell分割线的内边距
默认左边有间隙,通过设置可以取消间隙
tableView.separatorInset=UIEdgeInsetsZero;
或者自定义
tableView.separatorInset=UIEdgeInsetsMake(0, 0, 0, 0);
20190409110311.jpg
separatorStyle
分割线样式
separatorStyle=UITableViewCellSeparatorStyleNone;可以去掉分割线
separatorColor
分割线颜色
separatorEffect
特效,需要自定义
separatorInsetReference
是个枚举值,也是设置cell分割线内边距的
UITableViewSeparatorInsetFromCellEdges,默认值
UITableViewSeparatorInsetFromAutomaticInsets有间隙,设置separatorInset无效
backgroundView
背景视图UIView类型
numberOfSections
组数,只读属性,只能通过
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
修改。打印一下值
2019-04-09 13:34:54.469863+0800 tableView[3630:86352] 10
visibleCells
,显示在当前屏幕上的所有cell,只读属性
indexPathsForVisibleRows
只读属性,显示在屏幕上的每个cell的位置NSIndexPath
类型
"<NSIndexPath: 0xc87d249eb15ac677> {length = 2, path = 0 - 0}",
"<NSIndexPath: 0xc87d249eb17ac677> {length = 2, path = 0 - 1}",
hasUncommittedUpdates
个人觉得是个占位符,在编辑cell时候的指示。
editing
编辑模式默认是NO。设置YES后,cell会出现insert/delete/reorder控件
allowsSelection
默认是YES,设置为NO不响应任何事件(点击没效果)
allowsSelectionDuringEditing
默认NO,编辑模式下不能选中;设置YES后有选中效果。
allowsMultipleSelection
多选,默认NO,设置YES可以选中多个。
allowsMultipleSelectionDuringEditing
默认NO,编辑模式下不能选中多个,设置YES可以选中多个;
indexPathForSelectedRow
选中的行号
<NSIndexPath: 0xdd209fb893cd93b5> {length = 2, path = 1 - 1}
indexPathsForSelectedRows
选中多行的行号,前提是开启allowsMultipleSelection
否则和indexPathForSelectedRow
效果一样
"<NSIndexPath: 0xc0cdbcda00f2cef4> {length = 2, path = 1 - 0}",
"<NSIndexPath: 0xc0cdbcda00d2cef4> {length = 2, path = 1 - 1}",
"<NSIndexPath: 0xc0cdbcda00b2cef4> {length = 2, path = 1 - 2}"
sectionIndexMinimumDisplayRowCount
当行数达到此值时,在右侧显示特殊节索引列表。如果没设置索引,没任何效果
sectionIndexColor
设置正常索引颜色
sectionIndexBackgroundColor
设置索引背景色
sectionIndexTrackingBackgroundColor
选中索引的颜色
cellLayoutMarginsFollowReadableWidth
,ios9之后,cell两侧有空白,如下设置可以去掉空白
tableView.cellLayoutMarginsFollowReadableWidth = NO;
insetsContentViewsToSafeArea
tableHeaderView
表头部视图
tableFooterView
表尾部视图
dragInteractionEnabled
是否允许拖动。默认ipad为YES,iphone为NO
代理
数据源代理
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
必须实现的两个方法
每组多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
每个cell要显示的内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;每个cell要显示的内容
可选的
有多少组,默认1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
每组头部标题
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
每组尾部标题
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
当前行是否允许编辑,默认所有行都可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
// Moving/reordering
为特定行显示reorder附件视图。默认情况下,只有数据源实现-tableView:moveRowAtIndexPath:toIndexPath时,才会显示reorder控件:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
// Index
右边的索引序列(类似电话簿,ABC...Z)
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView;
每组对应的索引序列值
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;
// Data manipulation - insert and delete support
根据UITableViewCellEditingStyle来判断是那种行为,具体行为要在方法体内实现
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
// Data manipulation - reorder / moving support
cell移动时会调用这个方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
tableview的属性代理
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate
cell将要显示
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
HeaderView将要显示
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
FooterView将要显示
- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
已近显示cell
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
已近显示HeaderView
- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
已近显示FooterView
- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
每组头部高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
每组尾高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
估算高度
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
@property (nonatomic, weak, nullable) id <UITableViewDataSourcePrefetching> prefetchDataSource NS_AVAILABLE_IOS(10_0);
iOS10开始有的
用法和上面的代理一样,遵守协议。实现代理方法
self.tableView.prefetchDataSource=self;
实现这两个方法,第一个必须实现,会在快速滑动tableView的时候调用,方法体里用来完成一些耗时操作。
第二个方法可选,在快速滑动tableView的时候,停下,反方向就会调用这个方法来取消耗时操作
- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;
- (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;