UITableView API大百科

Posted Lotheve

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableView API大百科相关的知识,希望对你有一定的参考价值。

UITableView接口

常规

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style

初始化方法,调用init方法初始化时默认style为UITableViewStylePlain

@property (nonatomic, readonly) UITableViewStyle style;

表视图类型,包括UITableViewStylePlainUITableViewStyleGrouped

@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;

数据源对象

@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;

代理对象

@property (nonatomic) CGFloat rowHeight;
@property (nonatomic) CGFloat sectionHeaderHeight;
@property (nonatomic) CGFloat sectionFooterHeight;

默认cell/sectionHeaderView/sectionFooterView高度

@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_ios(7_0);
@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); 
@property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); 

cell/sectionHeaderView/sectionFooterView预估高度。关于预估高度,在下面介绍定制预估高度的代理方法时做较详细说明。

数据

- (void)reloadData; 

重新加载表视图

- (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0);

重新加载索引

信息

@property (nonatomic, readonly) NSInteger numberOfSections;

分组数

- (NSInteger)numberOfRowsInSection:(NSInteger)section;

返回指定分组的行数

- (CGRect)rectForSection:- (NSInteger)section;                                    // includes header, footer and all rows
- (CGRect)rectForHeaderInSection:(NSInteger)section;
- (CGRect)rectForFooterInSection:(NSInteger)section;
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;

获取分组、分组头视图、分组尾视图、行所在的Rect

- (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; 

获取指定坐标的cell行的索引,若坐标不落在cell上返回nil

- (nullable NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;

获取指定cell的索引

- (nullable NSArray<NSIndexPath *> *)indexPathsForRowsInRect:(CGRect)rect; 

获取指定rect区域的cell索引数组

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;

获取指定索引的cell,若对应的cell当前未显示,返回nil

@property (nonatomic, readonly) NSArray<__kindof UITableViewCell *> *visibleCells;

返回屏幕中可见cell的数组

@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForVisibleRows;

返回屏幕中可见cell的索引对象数组

- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (nullable UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);

获取指定分组的头视图/尾视图

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

滚动到指定索引对应的cell处。scrollPosition枚举参数用来指定目标cell滚动的目标位置

typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
UITableViewScrollPositionNone, //就近原则
UITableViewScrollPositionTop, //滚到视图上方
UITableViewScrollPositionMiddle, //滚到中间
UITableViewScrollPositionBottom //滚到视图下方
};

- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

滚动到当前选中的cell处,参数scrollPosition同上

更新

- (void)beginUpdates;
- (void)endUpdates; 

用来批量操作插入删除等更新,或者用来动态更新行高

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);

对分组操作插入、删除、重载、移动

- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);

对行操作插入、删除、重载、移动

编辑

@property (nonatomic, getter=isEditing) BOOL editing;                             // default is NO. setting is not animated.

编辑状态,getter方法判断是否处于编辑状态,setter方法设置编辑状态,无动画

- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

置标视图为编辑状态,可设置动画效果

选择

@property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0);

允许选中cell,默认YES

@property (nonatomic) BOOL allowsSelectionDuringEditing;

编辑状态下是否允许选中,默认NO

@property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);

是否允许多选,默认NO

@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);

编辑状态下是否允许多选

@property (nonatomic, readonly, nullable) NSIndexPath *indexPathForSelectedRow;

获取当前选中的cell的索引

@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForSelectedRows

获取当前选中的cell的索引数组(多选模式)

- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;

选中指定cell并滚动到cell所在位置,scrollPosition参数为cell最终所处位置

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;

取消对指定cell的选中

显示

@property (nonatomic, strong, nullable) UIView *backgroundView NS_AVAILABLE_IOS(3_2); 

设置背景视图(位于contentView上层,cell和sectionView下层)

@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle

分割线style

@property (nonatomic, strong, nullable) UIColor *separatorColor

分割线颜色

@property (nonatomic, copy, nullable) UIVisualEffect *separatorEffect

设置毛玻璃效果 iOS8才能用,这里暂时不做探究

@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0)

分割线缩进量

@property (nonatomic) BOOL cellLayoutMarginsFollowReadableWidth NS_AVAILABLE_IOS(9_0);

网上说iOS9中这个属性不设置为NO的话Cell分割线左边会空出很多,实际测试中并没有出现这种现象??尚不清楚该属性的作用

@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;

能够显示索引栏的最小cell数(总) 默认为0

@property (nonatomic, strong, nullable) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) 

索引栏标题字体颜色

@property (nonatomic, strong, nullable) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) 

索引栏背景颜色(正常状态)

@property (nonatomic, strong, nullable) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0)

索引栏背景颜色(触摸状态)

@property (nonatomic, strong, nullable) UIView *tableHeaderView;

表视图的头视图(不要和sectionHeaderView混淆)

@property (nonatomic, strong, nullable) UIView *tableFooterView;

表视图的尾视图(不要和sectionFooterView混淆)

其他

- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);

用Xib注册cell

- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用类注册cell

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

重用cell

- (void)registerNib:(nullable UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用Xib注册分组头尾视图

- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

用类注册分组头尾视图

- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);

分组头尾视图出队

UITableViewDataSource

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

返回每个分组的行数

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

返回用于构建表视图的指定索引处的cell

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

返回分组数

- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

返回指定sectionHeaderView/sectionFooterView的标题,实现该代理方法会默认创建用于显示标题的sectionHeaderView/sectionFooterView(会被自定义的覆盖)。

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

返回指定行是否可编辑,默认全部可编辑

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

要实现编辑状态下可移动cell必须实现该方法,在编辑状态下会有移动控制按钮

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

根据indexPath指定可移动的cell项,默认全部可移动

- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView __TVOS_PROHIBITED;

返回(显示在表视图右边缘的)分组索引栏标题数组

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index __TVOS_PROHIBITED;

点击索引栏标题时调用,传入两个参数
title:索引标题
index:索引在titleForHeaderInSection返回的数组中的index
默认索引栏中的标题从上到下一次和tableview中的section从上到下逐个对应,通过该方法可以定制对应关系

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

编辑状态下提交编辑时调用 例如在编辑状态下点击删除按钮会调用该方法并传入值为UITableViewCellEditingStyleDeleteUITableViewCellEditingStyle参数,然后在该方法中手动删除相关数据源和cell。

注意: 如果想实现左划cell进入删除状态,必须实现该方法!

NOTE:
To enable the swipe-to-delete feature of table views (wherein a user swipes horizontally across a row to display a Delete button), you must implement the tableView:commitEditingStyle:forRowAtIndexPath: method.

UITableViewDelegate

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);

cell/sectionHeaderView/sectionFooterView显示/隐藏时相关调用

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;

返回指定cell/sectionHeaderView/sectionFooterView的高度,会覆盖对应的rowHeight/sectionHeaderHeight/sectionFooterHeight属性(在这里定制不同cell的高度)。

- (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);

返回指定cell/sectionHeaderView/sectionFooterView的预估高度,会覆盖对应的estimatedRowHeight/estimatedSectionHeaderHeight/estimatedSectionFooterHeight属性(在这里定制不同cell的预估高度)。

注意

  1. 预估高度纯碎是为了提升加载表视图时的性能,即首次加载的时候无需将表视图contentSize的高度通过遍历所有cell的实际高度累加计算出来,而是通过预估值来暂时估算整体高度并加载cell,当cell显示时才根据其实际高度动态更新contentSize的高度。这使得在首次加载时减少了heightForRowAtIndexPath方法的调用,对于包含大量cell的表视图在加载时能提升较大的性能。但有一个问题,如果预估高度和实际高度相差过大,或者各个cell之间时间高度差距较大且无规律,滚动过程中可能造成cell”上下弹跳”的困扰,影响用户体验。针对此问题的做法是通过estimatedHeightForRowAtIndexPath定制不同cell的预估高度,如果还是不行的话干脆就不要预估了,个人认为以牺牲用户体验才成全性能是得不偿失的。
  2. 预估高度是无法被当成实际高度使用的,加入只设置了预估高度属性estimatedRowHeight或者实现了estimatedHeightForRowAtIndexPath方法,而没有设置rowHeight属性或heightForRowAtIndexPath方法,那么cell的显示高度为默认的44,而不是设置的预估高度。这里只是以cell作为说明,sectionHeaderView和sectionFooterView也是一样的。
  3. 如果设置了预估高度,表视图首次加载时以预估高度来决定要加载多少个cell的。例如设置了每个cell的预估高度为50,设置了实际高度为100,那么对于一个frame高度为500的表视图,首次加载是加载10个cell(500/50),而不是5个(500/100)。其实明白了预估高度的机制就不难明白其原因。
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section; 

自定义sectionHeaderView/sectionFooterView,系统提供了用于显示section标题的UITableViewHeaderFooterView(继承自UIView),当然也可以根据实际需要自定义。若返回的是UITableViewHeaderFooterView实例,其标题由titleForHeaderInSection/titleForFooterInSection决定。

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0) __TVOS_PROHIBITED;

定制cell附件

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;

点击cell附件按钮时回调

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);

定制点击cell时能否高亮以及监控高亮过程

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

当点击某一行时可以自定义选中其他行,参数indexPath为当前所点击行的索引。默认返回indexPath,返回nil则不选中

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);

点击某行时取消指定行的选中。返回nil相当于实现了多选的功能,当allowsMultipleSelection属性为YES时该方法永远不会被调用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);

监控cell选中过程

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

定制cell的编辑类型,返回枚举常量。不实现该方法默认所有编辑类型为删除类型(UITableViewCellEditingStyleDelete)。该方法配合tableView: commitEditingStyle: forRowAtIndexPath:使用。

typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {
UITableViewCellEditingStyleNone, //无编辑类型
UITableViewCellEditingStyleDelete, //删除
UITableViewCellEditingStyleInsert //插入
};

- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;

定制编辑类型为删除模式下删除按钮的标题

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

iOS8后可用。在编辑状态下左滑cell默认可现实一个delete按钮,上一个方法可以对delete按钮标题进行自定义,这个方法则可以对按钮完全自定义。

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;

设置在编辑状态下cell是否缩进 经测试只对cell多选编辑模式下有作用

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;

当cell允许编辑且editingStyleForRowAtIndexPath设置的编辑模式为删除模式时,左划cell能够进入指定cell的编辑模式显示删除按钮,这时回调willBeginEditingRowAtIndexPath方法。右划退出编辑模式时回调didEndEditingRowAtIndexPath

注意:通过设置editing属性进入编辑模式并不会回调这两个方法。

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;  

移动cell时,默认为移动到当前手指所在处的cell处,通过该方法可以自定义移动cell的目标位置。

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;

用于设置cell内容的缩进级别

- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0);
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

这3个方法必须全部实现,才能实现通过长按cell弹出编辑菜单拷贝粘贴cell内容。

常量

UIKIT_EXTERN NSString *const UITableViewIndexSearch;

将该常量包含在sectionIndexTitlesForTableView:返回的section index的数组中,显示一个放大镜图标。通常将该常量作为数组的第一个元素,以点击时回到最上方搜索框。

UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension NS_AVAILABLE_IOS(5_0);

分局自动布局自动计算高度,iOS8中通过将rowHeight的值设置为它可以自cell自动布局的基础上自动计算cell高度(前提是同时设置了estimatedHeight)。

UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;

当cell选中情况发生变化时发送的通知

坑百挑不厌

  1. UITableViewseparatorInset无论怎么设置分割线左边始终无法顶格,解决办法如下:

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    // Remove seperator inset
    if([cell respondsToSelector:@selector(setSeparatorInset:)]){
        [cell setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
    // Prevent the cell from inheriting the Table View‘s margin settings
    if([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]){
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    // Explictly set your cell‘s layout margins
    if([cell respondsToSelector:@selector(setLayoutMargins:)]){
        [cell setLayoutMargins:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
    }
  2. 分组头/尾视图若使用系统提供的UITableViewHeaderFooterView创建,无法直接设置标题的字体颜色,可以在willDisplayHeaderView方法中设置。简直莫名其妙!

    - (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    //使用系统的UITableViewHeaderFooterView
    UITableViewHeaderFooterView *headerView = [[UITableViewHeaderFooterView alloc]initWithReuseIdentifier:@"SectionHeaderView"];
    headerView.contentView.backgroundColor = [UIColor yellowColor];  //不能直接设置headerView的backgroundColor
    [headerView.textLabel setTextColor:[UIColor greenColor]];  //直接设置字体颜色没效果 只能在willDisplayHeaderView方法中设置
    headerView.textLabel.text = [NSString stringWithFormat:@"%zd",section];
    return headerView;
    }
    
    - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section{
    UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;
    [headerView.textLabel setTextColor:[UIColor orangeColor]];
    }
  3. 在tableView的style为plain的情况,若设置了sectionHeaderView或sectionFooterView,滑动过程中会始终悬浮在表视图顶端或末尾,让sectionHeaderView不悬停的方法:

    CGFloat sectionHeaderHeight = 50;
    if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
    scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    } else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
    scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
    }
  4. 对于style未group的tableView,系统自动设置了sectionHeaderView和sectionViewFooter,使得section之间有明见的间距。可以通过自定义sectionHeaderView/sectionViewFooter的高度达到想要的效果。

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return CGFLOAT_MIN;  //注意若返回0则显示默认高度
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return CGFLOAT_MIN;
    }

以上是关于UITableView API大百科的主要内容,如果未能解决你的问题,请参考以下文章

导航到另一个片段时触发 API 调用

UISearch 在 JSON api UITableView 中不起作用

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

维基百科API +跨域请求

历史上的今天 API (数据来自维基百科)

微信小程序代码片段