//
// UITableView.h
// UIKit
//
// Copyright (c) 2005-2013, Apple Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIScrollView.h>
#import <UIKit/UISwipeGestureRecognizer.h>
#import <UIKit/UITableViewCell.h>
#import <UIKit/UIKitDefines.h>
typedef NS_ENUM(NSInteger, UITableViewStyle) {
UITableViewStylePlain, // regular table view
UITableViewStyleGrouped // preferences style table view
};
typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
UITableViewScrollPositionNone,
UITableViewScrollPositionTop,
UITableViewScrollPositionMiddle,
UITableViewScrollPositionBottom
}; // scroll so row of interest is completely visible at top/center/bottom of view
typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
UITableViewRowAnimationFade,
UITableViewRowAnimationRight, // 从右边插入或者删除每一行
UITableViewRowAnimationLeft, // 从左边开始插入每一行或者删除每一行
UITableViewRowAnimationTop, // 插入的时候向下移动,删除的时候向上移动(插入和删除始终从第一行开始)
UITableViewRowAnimationBottom, // 插入的时候向上移动,删除的时候向下移动(插入和删除始终从最后一行开始)
UITableViewRowAnimationNone, // available in iOS 3.0
UITableViewRowAnimationMiddle, // available in iOS 3.2. attempts to keep cell centered in the space it will/did occupy
UITableViewRowAnimationAutomatic = 100 // available in iOS 5.0. chooses an appropriate animation style for you
};
UIKIT_EXTERN NSString *const UITableViewIndexSearch NS_AVAILABLE_IOS(3_0);
UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension NS_AVAILABLE_IOS(5_0);
@class UITableView;
@class UINib;
@protocol UITableViewDataSource;
@class UILongPressGestureRecognizer;
@class UITableViewHeaderFooterView;
@class UIRefreshControl;
#pragma mark - 代理方法
@protocol UITableViewDelegate <NSObject, UIScrollViewDelegate> // 默认遵守基协议和ScrollView的协议,所以能滚动
@optional
#pragma mark @optional
#pragma mark 显示样式修改方式
// 将要显示cell
- (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);
// cell已经显示完毕会调用
- (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);
#pragma mark 返回cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; // 设置cell的行高
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; // 设置顶部的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; // 设置底部的高度
// 使用估算高度方法可以快速计算出高度值,这样可以加速table的加载速度
// 如果这些方法被实现,上面的计算高度的方法将被推迟调用,直到views已经准备好被加载,所以耗费资源高的逻辑可以放在这里
- (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); // 返回某一组底部的高度
// 设置头部标题栏显示的控件
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
// 设置底部栏显示的控件
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
#pragma mark 右边辅助按钮
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0);
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
#pragma mark Selection
// 当点击某一行的时候,这个方法会被调用
- (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); // 取消高亮
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; // 某一行在点击的时候调用的方法
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0); // / 某一行在取消点击的时候调用的方法
#pragma mark 编辑
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath; // 编辑样式
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0); // 向左滑动时显示的文字
// Controls whether the background is indented while editing. If not implemented, the default is YES. This is unrelated to the indentation level below. This method only applies to grouped style table views.
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;
// The willBegin/didEnd methods are called whenever the 'editing' property is automatically changed by the table (allowing insert/delete/move). This is done by a swipe activating a single row
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;
#pragma mark Moving/reordering
// Allows customization of the target row for a particular row as it is being moved/reordered
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath; // 将某一行和另一行进行交换
#pragma mark Indentation
// 缩进显示,只能对没有图片的行进行缩进,有图片的行,图片不会进行缩进
- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;
// 复制和粘贴时,下面的三个方法在设置代理的时候必须要求实现
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0);
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0);
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0);
@end
UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;
//_______________________________________________________________________________________________________________
#pragma - mark 声明部分
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableView : UIScrollView <NSCoding>
- (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style; // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
@property (nonatomic, readonly) UITableViewStyle style; // 设置UITableView的样式
@property (nonatomic, assign) id <UITableViewDataSource> dataSource; // 用来设置数据源
@property (nonatomic, assign) id <UITableViewDelegate> delegate; // 代理用来监听UITableView的点击
@property (nonatomic) CGFloat rowHeight; // 行高,可以通过代码设置,默认是 44
@property (nonatomic) CGFloat sectionHeaderHeight; // 头部view的行高,默认是 10
@property (nonatomic) CGFloat sectionFooterHeight; // 底部view的行高,默认是 10
@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // 默认是 0 ,也就是没有公差
@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); // 默认是 0 ,也就是没有公差
@property (nonatomic) CGFloat estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); // 默认是 0 ,也就是没有公差
@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // allows customization of the frame of cell separators
@property(nonatomic, readwrite, retain) UIView *backgroundView NS_AVAILABLE_IOS(3_2); //
#pragma mark 刷新数据
- (void)reloadData; // 重新刷新所有数据
- (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0); //
#pragma mark Info
- (NSInteger)numberOfSections; // 获取分了多少组
- (NSInteger)numberOfRowsInSection:(NSInteger)section; // 获取某一组有多少行
- (CGRect)rectForSection:(NSInteger)section; // 返回某一组的形状,包括顶部、底部和所有行
- (CGRect)rectForHeaderInSection:(NSInteger)section; // 返回某一组的顶部的形状
- (CGRect)rectForFooterInSection:(NSInteger)section; // 返回某一组的底部的形状
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;
#pragma - mark 按钮点击时,取得按钮的中心,通过此方法取得按钮所在的cell
- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; // 如果某一个点在某一行之外则返回空
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell; // 如果某一个cell不可见则返回空
- (NSArray *)indexPathsForRowsInRect:(CGRect)rect; // returns nil if rect not valid
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; // returns nil if cell is not visible or index path is out of range
// 可见的cell
- (NSArray *)visibleCells;
- (NSArray *)indexPathsForVisibleRows;
- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
#pragma mark 插入/删除/重新加载 行
- (void)beginUpdates; // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable
- (void)endUpdates; // only call insert/delete/reload calls or change the editing state inside an update block. otherwise things like row count, etc. may be invalid.
#pragma - mark 实现动态的打开和关闭某一组使用这些方法
- (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 *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadRowsAtIndexPaths:(NSArray *)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.
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
@property(nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0); // 在非编辑模式下,控制每一行是否能被选择,默认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); // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode
// Selection
- (NSIndexPath *)indexPathForSelectedRow; // 返回被选择行的 IndexPath(空或者组号和行号)
- (NSArray *)indexPathsForSelectedRows NS_AVAILABLE_IOS(5_0); // 返回被选择行(多行)的 IndexPath(空或者组号和行号)装入的数组
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;
#pragma mark - 外观
@property(nonatomic) NSInteger sectionIndexMinimumDisplayRowCount; // show special section index list on right when row count reaches this value. default is 0
@property(nonatomic, retain) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // color used for text of the section index
@property(nonatomic, retain) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while not being touched
@property(nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while it is being touched
@property(nonatomic) UITableViewCellSeparatorStyle separatorStyle; // 行与行之间的分割线样式
@property(nonatomic,retain) UIColor *separatorColor; // 分割线颜色
@property(nonatomic,retain) UIView *tableHeaderView; // 顶部的view子控件
@property(nonatomic,retain) UIView *tableFooterView;
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; // 通过标识找出缓存池中的可重用的对象,而不会重新创建一个全新的对象
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // 通过标示符找到某一个特定的行数的cell
- (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0); // 通过标识从缓存池取出头部或者底部的view
// 注册了nib以后,可以
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
- (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
- (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
@end
#pragma mark - 数据源方法
@protocol UITableViewDataSource<NSObject>
@required
#pragma mark @required
// 返回每一组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
// 返回每一行的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@optional
#pragma mark @optional
// 返回分组个数,不实现则默认是一组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
// 每一组顶部显示的标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
// 每一组底部显示的标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
#pragma mark 编辑
// 是否能被编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
#pragma mark 移动/重排序
// indexPath处的cell 是否能被移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
#pragma mark 索引
// 最右边显示的索引(e.g. "ABCD...Z#")
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index; // tell table which section corresponds to section title/index (e.g. "B",1))
#pragma mark 数据操作 插入和删除 support
// 如果实现了这个方法, 就自动实现了滑动删除的功能,滑动的时候不会调用这个方法,在删除的时候才会调用这个方法(提交了一个删除操作会调用)
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; // 交换两个位置的cell
@end
//_______________________________________________________________________________________________________________
#pragma mark - 这部分提供了简便的方法来使用 NSIndexPath 展示分组和行
@interface NSIndexPath (UITableView)
+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section; // 返回一个带有行和分组信息的 NSIndexPath对象
@property(nonatomic,readonly) NSInteger section; // 分组
@property(nonatomic,readonly) NSInteger row; // 分行
@end
UITableView.h
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 新爱莲说Hélène, je m'appelle Hélène/Hélène Rollès 蓍草填词/江北客@伏羲...