一、初始化方法
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;
這個方法初始化表視圖的frame大小并且設置一個風格
UITableViewStyle是一個枚舉,如下:
typedef NS_ENUM(NSInteger, UITableViewStyle) {
UITableViewStylePlain, // 標準的表視圖風格
UITableViewStyleGrouped // 分組的表視圖風格};
二、常用屬性
1. 獲取表視圖的風格(只讀屬性)
@property(nonatomic, readonly) UITableViewStyle style;
2. 設置表示圖代理和數(shù)據(jù)源代理
@property(nonatomic, assign) id <UITableViewDataSource> dataSource;
@property(nonatomic, assign) id <UITableViewDelegate> delegate;
3. 設置表示圖的行高(默認為44)
@property(nonatomic) CGFloat rowHeight;
設置分區(qū)的頭視圖高度和尾視圖高度(當代理方法沒有實現(xiàn)時才有效)
@property (nonatomic) CGFloat sectionHeaderHeight;
@property (nonatomic) CGFloat sectionFooterHeight;
4. 設置一個行高的估計值(默認為0,表示沒有估計,7.0之后可用)
@property (nonatomic) CGFloat estimatedRowHeight;
注意:這個屬性官方的解釋是如果你的tableView的行高是可變的,那么設計一個估計高度可以加快代碼的運行效率。
下面這兩個屬性和上面相似,分別設置分區(qū)頭視圖和尾視圖的估計高度(7.0之后可用)
@property (nonatomic) CGFloat estimatedSectionHeaderHeight;
@property (nonatomic) CGFloat estimatedSectionFooterHeight;
5. 設置分割線的位置
@property (nonatomic) UIEdgeInsets separatorInset;
如果細心,你可能會發(fā)現(xiàn)系統(tǒng)默認的tableView的分割線左端并沒有頂?shù)竭呇亍Mㄟ^這個屬性,可以手動設置分割線的位置偏移,比如你想讓tableView的分割線只顯示右半邊,可以如下設置:
UITableView * tab = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
tab.separatorInset = UIEdgeInsetsMake(0, tab.frame.size.width/2, 0,0);
6. 設置tableView背景view視圖
@property(nonatomic, readwrite, retain) UIView *backgroundView;
三、常用方法詳解
1. 重載tableView
- (void)reloadData;
2. 重載索引欄
- (void)reloadSectionIndexTitles;
這個方法常用于新加或者刪除了索引類別而無需刷新整個表視圖的情況下。
3. 獲取分區(qū)數(shù)
- (NSInteger)numberOfSections;
4. 根據(jù)分區(qū)獲取行數(shù)
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
5. 獲取分區(qū)的大小(包括頭視圖,所有行和尾視圖)
- (CGRect)rectForSection:(NSInteger)section;
6. 根據(jù)分區(qū)分別獲取頭視圖,尾視圖和行的高度
- (CGRect)rectForHeaderInSection:(NSInteger)section;
- (CGRect)rectForFooterInSection:(NSInteger)section;
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;
7. 獲取某個點在tableView中的位置信息
- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;
8. 獲取某個cell在tableView中的位置信息
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;
9. 根據(jù)一個矩形范圍返回一個信息數(shù)組,數(shù)組中是每一行row的位置信息
- (NSArray *)indexPathsForRowsInRect:(CGRect)rect;
10. 通過位置路徑獲取cell
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
11. 獲取所有可見的cell
- (NSArray *)visibleCells;
12. 獲取所有可見行的位置信息
- (NSArray *)indexPathsForVisibleRows;
13. 根據(jù)分區(qū)獲取頭視圖
- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section;
14. 根據(jù)分區(qū)獲取尾視圖
- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section;
15. 使表示圖定位到某一位置(行)
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
注意:indexPah參數(shù)是定位的位置,決定于分區(qū)和行號。animated參數(shù)決定是否有動畫。
scrollPosition參數(shù)決定定位的相對位置,它使一個枚舉,如下:
typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
UITableViewScrollPositionNone,//同UITableViewScrollPositionTop
UITableViewScrollPositionTop,//定位完成后,將定位的行顯示在tableView的頂部
UITableViewScrollPositionMiddle,//定位完成后,將定位的行顯示在tableView的中間
UITableViewScrollPositionBottom//定位完成后,將定位的行顯示在tableView最下面
};
16. 使表示圖定位到選中行
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
這個函數(shù)與上面的非常相似,只是它是將表示圖定位到選中的行。
四、tableView操作刷新塊的應用
在介紹動畫塊之前,我們先看幾個函數(shù):
1. 插入分區(qū)
- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
animation參數(shù)是一個枚舉,枚舉的動畫類型如下
typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
UITableViewRowAnimationFade,//淡入淡出
UITableViewRowAnimationRight,//從右滑入
UITableViewRowAnimationLeft,//從左滑入
UITableViewRowAnimationTop,//從上滑入
UITableViewRowAnimationBottom,//從下滑入
UITableViewRowAnimationNone, //沒有動畫
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic = 100 // 自動選擇合適的動畫
};
2. 刪除分區(qū)
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
3. 重載一個分區(qū)
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation ;
4. 移動一個分區(qū)
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection;
5. 插入一些行
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
6. 刪除一些行
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
7 .重載一些行
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
8. 移動某行
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath;
了解了上面幾個函數(shù),我們來看什么是操作刷新塊:
當我們調(diào)用的上面的函數(shù)時,tableView會立刻調(diào)用代理方法進行刷新,如果其中我們所做的操作是刪除某行,而數(shù)據(jù)源數(shù)組我們可能沒有刷新,程序就會崩潰掉,原因是代理返回的信息和我們刪除后不符。
IOS為我們提供了下面兩個函數(shù)解決這個問題:
1. 開始塊標志
- (void)beginUpdates;
2. 結(jié)束快標志
- (void)endUpdates;
我們可以將我們要做的操作全部寫在這個塊中,那么,只有當程序執(zhí)行到結(jié)束快標志后,才會調(diào)用代理刷新方法。代碼示例如下:
[tab beginUpdates];
[tab deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
[dataArray removeObjectAtIndex:1];
[tab endUpdates];
注意:不要在這個塊中調(diào)用reloadData這個方法,它會使動畫失效。
五、tableView的編輯操作
1. 設置是否是編輯狀態(tài)(編輯狀態(tài)下的cell左邊會出現(xiàn)一個減號,點擊右邊會劃出刪除按鈕)
@property(nonatomic, getter=isEditing) BOOL editing;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
2. 設置cell是否可以被選中(默認為YES)
@property(nonatomic) BOOL allowsSelection;
3. 設置cell編輯模式下是否可以被選中
@property(nonatomic) BOOL allowsSelectionDuringEditing;
4. 設置是否支持多選
@property(nonatomic) BOOL allowsMultipleSelection;
5. 設置編輯模式下是否支持多選
@property(nonatomic) BOOL allowsMultipleSelectionDuringEditing;
六、選中cell的相關(guān)操作
1. 獲取選中cell的位置信息
- (NSIndexPath *)indexPathForSelectedRow;
2. 獲取多選cell的位置信息
- (NSArray *)indexPathsForSelectedRows;
3. 代碼手動選中與取消選中某行
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;
注意:這兩個方法將不會回調(diào)代理中的方法。
七、tableView附件的相關(guān)方法
1. 設置索引欄最小顯示行數(shù)
@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;
2. 設置索引欄字體顏色
@property (nonatomic, retain) UIColor *sectionIndexColor;
3. 設置索引欄背景顏色
@property (nonatomic, retain) UIColor *sectionIndexBackgroundColor;
4. 設置索引欄被選中時的顏色
@property (nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor;
5. 設置分割線的風格
@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle;
這個風格是一個枚舉,如下:
typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
UITableViewCellSeparatorStyleNone,//無線
UITableViewCellSeparatorStyleSingleLine,//有線
UITableViewCellSeparatorStyleSingleLineEtched
};
6. 設置分割線顏色
@property(nonatomic, retain) UIColor *separatorColor;
7. 設置分割線毛玻璃效果(IOS8之后可用)
@property(nonatomic, copy) UIVisualEffect *separatorEffect;
注意:這個屬性是IOS8之后新的。
8. 設置tableView頭視圖
@property(nonatomic, retain) UIView *tableHeaderView;
9. 設置tableView尾視圖
@property(nonatomic, retain) UIView *tableFooterView;
10. 從復用池中取cell
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;
11. 獲取一個已注冊的cell
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath
12. 從復用池獲取頭視圖或尾視圖
- (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier;
13. 通過xib文件注冊cell
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier;
14. 通過OC類注冊cell
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier
上面兩個方法是IOS6之后的方法。
15. 通過xib文件和OC類獲取注冊頭視圖和尾視圖
- (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier;
- (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)