iOS-UIKit框架学习—UITableView 发表于 2017-02-16 | 分类于 iOS | | 阅读次数: UITableView在iOS开发中是使用最广泛的一个控件,用于展示单个项目数据的列表,同时也可以进行选择和编辑操作。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328@class UITableView;NS_CLASS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED @interface UITableViewRowAction : NSObject <NSCopying>// 创建左划时显示的按钮+ (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;// 滑动时cell的风格@property (nonatomic, readonly) UITableViewRowActionStyle style;// 标题@property (nonatomic, copy, nullable) NSString *title;// 背景颜色@property (nonatomic, copy, nullable) UIColor *backgroundColor;// 毛玻璃效果@property (nonatomic, copy, nullable) UIVisualEffect* backgroundEffect;@end// UITableViewFocusUpdateContext : 焦点更新的上下文NS_CLASS_AVAILABLE_IOS(9_0) @interface UITableViewFocusUpdateContext : UIFocusUpdateContext@property (nonatomic, strong, readonly, nullable) NSIndexPath *previouslyFocusedIndexPath;@property (nonatomic, strong, readonly, nullable) NSIndexPath *nextFocusedIndexPath;@end//_______________________________________________________________________________________________________________// this represents the display and behaviour of the cells.@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>@optional// 即将显示tableviewcell时调用- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;// 即将显示header时调用,在cell之后调用- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);// 即将显示footer时调用,在header之后调用- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);// 在删除cell之后调用,停止显示cell的时候调用,界面不显示cell时。- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);// 停止显示header的时候调用- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);// 停止显示footer的时候调用- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);// 设置某行cell高度- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;// 设置header高度- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;// 设置footer高度- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;// 设置每行cell的估算高度- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);// 对可变的header 高度的估算- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);// 对可变的footer 高度的估算- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);// 设置第section分组的headers自定义视图- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;// 设置第section分组的footer自定义视图- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;// 可手动调用,在其他的触发事件中 传入tableview 以及indexPath参数,进行操作- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;// Selection// 设置是否允许cell高亮状态- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);// 按下cell未弹起时调用,即即将高亮时调用,如果return no 则点击的时候没有反应,但是还是会执行此方法- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);// 按下cell弹起时调用- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);// 将要选定指定的cell时调用- (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;// 将要取消选定的cell时调用- (nullable NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);// 选择指定的cell时调用- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;// 取消选择指定cell时调用- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);// 编辑// 返回每一行cell的编辑模式, 可以再次设置add或者删除操作- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;// cell左滑删除时,删除按钮的标题- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;// 自定义编辑左滑后出现的界面- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;// 编辑模式下是否缩进指定行背景- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;// 进入编辑模式时调用- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;// 编辑结束时调用- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(nullable NSIndexPath *)indexPath __TVOS_PROHIBITED;// 移动// 在编辑状态下,返回可以进行移动重新排序的indexpath- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;// 缩进// 设置cell的缩进- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;// 复制/粘贴// 是否在指定行显示菜单,返回值为YES时,长按显示菜单- (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);// cell是否可以获得焦点- (BOOL)tableView:(UITableView *)tableView canFocusRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0);// 是否更新聚焦范围内发生的内容- (BOOL)tableView:(UITableView *)tableView shouldUpdateFocusInContext:(UITableViewFocusUpdateContext *)context NS_AVAILABLE_IOS(9_0);// 聚焦范围内容更新完成后调用- (void)tableView:(UITableView *)tableView didUpdateFocusInContext:(UITableViewFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator NS_AVAILABLE_IOS(9_0);// 设置聚焦时首选视图- (nullable NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView NS_AVAILABLE_IOS(9_0);@endNS_CLASS_AVAILABLE_IOS(2_0) @interface UITableView : UIScrollView <NSCoding>// cell的构造方法,自定义cell时,如果要初始化设置cell属性时,可以重写该方法,在方法内部设置- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER;- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;// UITableView的类型: plain类型和group分组类型@property (nonatomic, readonly) UITableViewStyle style;// 数据源@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;// 代理@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;// 预读取数据@property (nonatomic, weak) id<UITableViewDataSourcePrefetching> prefetchDataSource NS_AVAILABLE_IOS(10_0);// 行高@property (nonatomic) CGFloat rowHeight;// 分组Header的高度@property (nonatomic) CGFloat sectionHeaderHeight;// 分组Footer的高度@property (nonatomic) CGFloat sectionFooterHeight; // will return the default// 估计行高@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); //// 分组Header估计高度@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0);// 分组Footer估计高度@property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0);// 分割线内边距@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;// 背景view@property (nonatomic, strong, nullable) UIView *backgroundView NS_AVAILABLE_IOS(3_2);// 重新载入tableview所有cell 一般是在数据源有改变的时候- (void)reloadData;// 重新载入,section的索引标题。- (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0);// 获取TableView共有多少组@property (nonatomic, readonly) NSInteger numberOfSections;// 获取第section组共有多少行- (NSInteger)numberOfRowsInSection:(NSInteger)section;// 获取某一组的frame,头部frame,尾部frame,cell的frame- (CGRect)rectForSection:(NSInteger)section;- (CGRect)rectForHeaderInSection:(NSInteger)section;- (CGRect)rectForFooterInSection:(NSInteger)section;- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;// 返回指定坐标点的indexPath- (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;// 返回指定cell所在的indexPath- (nullable NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;// 返回指定范围内的所有indexPath的数组- (nullable NSArray<NSIndexPath *> *)indexPathsForRowsInRect:(CGRect)rect;// 返回indexPath所指向的cell- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;// 当前可以看到的cell数组@property (nonatomic, readonly) NSArray<__kindof UITableViewCell *> *visibleCells;// 返回tableView中标识的可见的indexPath数组@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForVisibleRows;// 设置tableView的headerView- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);indexPathsForVisibleRows;// 设置tableView的footerView- (nullable UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);// 根据传入的indexPath,滚动到相对应的位置,第二个参数是控制对应的cell再滚动后处于tableview的顶部/底部/中部等- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;// 滚动到被选中项。滚动后处于tableview的顶部/底部/中部等- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;// 开始一系列的增删改移操作- (void)beginUpdates;// 操作结束更新数据- (void)endUpdates;// 对section进行插入,删除,刷新,移动操作- (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);// 编辑状态 默认为NO@property (nonatomic, getter=isEditing) BOOL editing;// 设置编辑状态动画显示- (void)setEditing:(BOOL)editing animated:(BOOL)animated;// cell 是否可以选择 默认为YES@property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0);// 编辑模式是否可以选择 默认为NO@property (nonatomic) BOOL allowsSelectionDuringEditing;// 是否可以多选 默认为NO@property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);// 编辑模式是否可以多选 默认为NO@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);// 获取选中行的indexPath@property (nonatomic, readonly, nullable) NSIndexPath *indexPathForSelectedRow;// 返回一个多行选中的indexpath数组@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForSelectedRows NS_AVAILABLE_IOS(5_0);// 调用此方法,此indexpath的cell被选中,若此cell不再可视范围内,自动按照最后一个参数的方式进行滚动- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;// 取消此indexpath的选中状态- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;// 索引条设置@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;// 索引条字体颜色@property (nonatomic, strong, nullable) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;// 索引条背景颜色@property (nonatomic, strong, nullable) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;// 按住时,索引条显示的背景颜色@property (nonatomic, strong, nullable) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;// 分割线的样式@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle __TVOS_PROHIBITED;// 分割线的颜色@property (nonatomic, strong, nullable) UIColor *separatorColor UI_APPEARANCE_SELECTOR __TVOS_PROHIBITED;// 分割线的玻璃效果@property (nonatomic, copy, nullable) UIVisualEffect *separatorEffect NS_AVAILABLE_IOS(8_0) UI_APPEARANCE_SELECTOR __TVOS_PROHIBITED;// 判断是否需要根据内容留有空白@property (nonatomic) BOOL cellLayoutMarginsFollowReadableWidth NS_AVAILABLE_IOS(9_0);// tableView的头部视图,不要和section header混淆@property (nonatomic, strong, nullable) UIView *tableHeaderView;// tableView的底部视图,不要和section footer混淆@property (nonatomic, strong, nullable) UIView *tableFooterView;// 从缓冲池获取cell- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;// 从缓冲池获取指定下标的cell- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);// 从缓冲池获取header,footer- (nullable __kindof UITableViewHeaderFooterView *)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);// 注册xib创建的cell- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);// 注册cell- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);// 注册xib创建的header,footer- (void)registerNib:(nullable UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);// 注册header,footer- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);// 是否自动将焦点上次集中索引的路径的单元格上 默认值为NO@property (nonatomic) BOOL remembersLastFocusedIndexPath NS_AVAILABLE_IOS(9_0); .@end@protocol UITableViewDataSource<NSObject>@required// 每组有多少行- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;// 返回显示的cell- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;@optional// tablaView上有多少组- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;// 返回某个section对应的header标题- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;// 返回某个section对应的footer标题- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;// 设置cell为可编辑模式- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;// 设置cell为可移动模式- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;// 设置右边栏的索引目录数组 e.g. "ABCD...Z#"- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView __TVOS_PROHIBITED;// 点击右侧索引表项时调用 e.g. "B",1- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index __TVOS_PROHIBITED;// 提交编辑- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;// 移动时使用- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;@end@protocol UITableViewDataSourcePrefetching <NSObject>@required// 设置预读取的优先排序数组- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;@optional// 预读取indexPath数组- (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;@end@interface NSIndexPath (UITableView)// 获取indexPath+ (instancetype)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;// 获取第几组@property (nonatomic, readonly) NSInteger section;// 获取第几行@property (nonatomic, readonly) NSInteger row;@end 12345678910111213141516171819202122232425262728293031323334353637// UITableView风格样式typedef NS_ENUM(NSInteger, UITableViewStyle) { UITableViewStylePlain, // 平铺式(补充:有section时,自动悬浮在顶部) UITableViewStyleGrouped // 分段式};// 选中某一行滚动到tableView顶、中、下的位置typedef NS_ENUM(NSInteger, UITableViewScrollPosition) { UITableViewScrollPositionNone, UITableViewScrollPositionTop, // 滚动到顶部 UITableViewScrollPositionMiddle, // 滚动到中部 UITableViewScrollPositionBottom // 滚到到底部};// 删除/添加时,cell过渡动画效果typedef NS_ENUM(NSInteger, UITableViewRowAnimation) { UITableViewRowAnimationFade, // 褪去 UITableViewRowAnimationRight, // 从右边滑入(或滑出) UITableViewRowAnimationLeft, // 从左边滑入(或滑出) UITableViewRowAnimationTop, // 从顶部插入(或删除) UITableViewRowAnimationBottom, // 从底部插入(或删除) UITableViewRowAnimationNone, // 无效果 UITableViewRowAnimationMiddle, // UITableViewRowAnimationAutomatic = 100};// 在编辑状态下左划cell时,cell右侧显示的按钮类型typedef NS_ENUM(NSInteger, UITableViewRowActionStyle) { UITableViewRowActionStyleDefault = 0, // 红色 UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault, UITableViewRowActionStyleNormal} NS_ENUM_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;// 设置索引的标题为搜索.UIKIT_EXTERN NSString *const UITableViewIndexSearch NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;// 选择发生改变后发送通知的keyUIKIT_EXTERN NSNotificationName const UITableViewSelectionDidChangeNotification;