afnetwork 使用

UITableView使用详解

2019-06-04  本文已影响0人  你duck不必呀

普通属性

styleUITableViewStyle两种风格,默认是UITableViewStylePlain即使是默认也都可以通过代码修改

 UITableViewStylePlain //如果有多组,每组标题会置顶悬浮

 UITableViewStyleGrouped //如果有多组,每组之间会有间隔

rowHeightsectionHeaderHeight,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分割线的内边距

20190409110046.jpg
默认左边有间隙,通过设置可以取消间隙
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控件

20190409135633.jpg

allowsSelection默认是YES,设置为NO不响应任何事件(点击没效果)

allowsSelectionDuringEditing默认NO,编辑模式下不能选中;设置YES后有选中效果。

allowsMultipleSelection多选,默认NO,设置YES可以选中多个。

20190409133530.jpg

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;
上一篇下一篇

猜你喜欢

热点阅读