IOS中UITableView使用總結
一、初始化方法
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;
這個方法初始化表視圖的frame大小并且設置一個風格,UITableViewStyle是一個枚舉,如下:
typedefNS_ENUM(NSInteger,?UITableViewStyle)?{
UITableViewStylePlain,//?標準的表視圖風格
UITableViewStyleGrouped//?分組的表視圖風格
};
二、常用屬性
獲取表視圖的風格(只讀屬性)
@property(nonatomic,readonly)UITableViewStylestyle;
設置表示圖代理和數據源代理(代理方法后面討論)
@property(nonatomic,assign)id dataSource;
@property(nonatomic,assign)id ? delegate;
設置表示圖的行高(默認為44)
@property(nonatomic)CGFloatrowHeight;
設置分區的頭視圖高度和尾視圖高度(當代理方法沒有實現時才有效)
@property(nonatomic)CGFloatsectionHeaderHeight;
@property(nonatomic)CGFloatsectionFooterHeight;
設置一個行高的估計值(默認為0,表示沒有估計,7.0之后可用)
@property(nonatomic)CGFloatestimatedRowHeight;
注意:這個屬性官方的解釋是如果你的tableView的行高是可變的,那么設計一個估計高度可以加快代碼的運行效率。
下面這兩個屬性和上面相似,分別設置分區頭視圖和尾視圖的估計高度(7.0之后可用)
@property(nonatomic)CGFloatestimatedSectionHeaderHeight;@property(nonatomic)CGFloatestimatedSectionFooterHeight;
設置分割線的位置
@property(nonatomic)UIEdgeInsetsseparatorInset;
如果細心,你可能會發現系統默認的tableView的分割線左端并沒有頂到邊沿。通過這個屬性,可以手動設置分割線的位置偏移,比如你向讓tableView的分割線只顯示右半邊,可以如下設置:
UITableView?*?tab?=?[[UITableView?alloc]initWithFrame:self.view.frame?style:UITableViewStylePlain];
tab.separatorInset=UIEdgeInsetsMake(0,?tab.frame.size.width/2,?0,0);
設置tableView背景view視圖
@property(nonatomic,readwrite,retain)UIView*backgroundView;
三、常用方法詳解
重載tableView
- (void)reloadData;
重載索引欄
- (void)reloadSectionIndexTitles;
這個方法常用語新加或者刪除了索引類別而無需刷新整個表視圖的情況下。
獲取分區數
- (NSInteger)numberOfSections;
根據分區獲取行數
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
獲取分區的大小(包括頭視圖,所有行和尾視圖)
- (CGRect)rectForSection:(NSInteger)section;
根據分區分別獲取頭視圖,尾視圖和行的高度
- (CGRect)rectForHeaderInSection:(NSInteger)section;
- (CGRect)rectForFooterInSection:(NSInteger)section;
- (CGRect)rectForRowAtIndexPath:(NSIndexPath*)indexPath;
獲取某個點在tableView中的位置信息
- (NSIndexPath*)indexPathForRowAtPoint:(CGPoint)point;
獲取某個cell在tableView中的位置信息
- (NSIndexPath*)indexPathForCell:(UITableViewCell*)cell;
根據一個矩形范圍返回一個信息數組,數組中是每一行row的位置信息
- (NSArray*)indexPathsForRowsInRect:(CGRect)rect;
通過位置路徑獲取cell
- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath;
獲取所有可見的cell
- (NSArray*)visibleCells;
獲取所有可見行的位置信息
- (NSArray*)indexPathsForVisibleRows;
根據分區獲取頭視圖
- (UITableViewHeaderFooterView*)headerViewForSection:(NSInteger)section;
根據分區獲取尾視圖
- (UITableViewHeaderFooterView*)footerViewForSection:(NSInteger)section;
使表示圖定位到某一位置(行)
- (void)scrollToRowAtIndexPath:(NSIndexPath*)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
注意:indexPah參數是定位的位置,決定于分區和行號。animated參數決定是否有動畫。scrollPosition參數決定定位的相對位置,它使一個枚舉,如下:
typedefNS_ENUM(NSInteger,?UITableViewScrollPosition)?{
UITableViewScrollPositionNone,//同UITableViewScrollPositionTop
UITableViewScrollPositionTop,//定位完成后,將定位的行顯示在tableView的頂部
UITableViewScrollPositionMiddle,//定位完成后,將定位的行顯示在tableView的中間
UITableViewScrollPositionBottom//定位完成后,將定位的行顯示在tableView最下面
};
使表示圖定位到選中行
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
這個函數與上面的非常相似,只是它是將表示圖定位到選中的行。
四、tableView操作刷新塊的應用
在介紹動畫塊之前,我們先看幾個函數:
插入分區
- (void)insertSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;
animation參數是一個枚舉,枚舉的動畫類型如下
typedefNS_ENUM(NSInteger,?UITableViewRowAnimation)?{
UITableViewRowAnimationFade,//淡入淡出
UITableViewRowAnimationRight,//從右滑入
UITableViewRowAnimationLeft,//從左滑入
UITableViewRowAnimationTop,//從上滑入
UITableViewRowAnimationBottom,//從下滑入
UITableViewRowAnimationNone,//沒有動畫
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic?=?100//?自動選擇合適的動畫
};
刪除分區
- (void)deleteSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;
重載一個分區
- (void)reloadSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation ;
移動一個分區
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection;
插入一些行
- (void)insertRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
刪除一些行
- (void)deleteRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
重載一些行
- (void)reloadRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
移動某行
- (void)moveRowAtIndexPath:(NSIndexPath*)indexPath toIndexPath:(NSIndexPath*)newIndexPath;
了解了上面幾個函數,我們來看什么是操作刷新塊:
當我們調用的上面的函數時,tableView會立刻調用代理方法進行刷新,如果其中我們所做的操作是刪除某行,而然數據源數組我們可能并沒有刷新,程序就會崩潰掉,原因是代理返回的信息和我們刪除后不符。
IOS為我們提供了下面兩個函數解決這個問題:
開始塊標志
- (void)beginUpdates;
結束快標志
- (void)endUpdates;
我們可以將我們要做的操作全部寫在這個塊中,那么,只有當程序執行到結束快標志后,才會調用代理刷新方法。代碼示例如下:
[tab?beginUpdates];
[tab?deleteRowsAtIndexPaths:@[[NSIndexPath?indexPathForRow:1?inSection:0]]?withRowAnimation:UITableViewRowAnimationLeft];
[dataArray?removeObjectAtIndex:1];
[tab?endUpdates];
注意:不要在這個塊中調用reloadData這個方法,它會使動畫失效。
五、tableView的編輯操作
設置是否是編輯狀態(編輯狀態下的cell左邊會出現一個減號,點擊右邊會劃出刪除按鈕)
@property(nonatomic,getter=isEditing)BOOLediting;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
設置cell是否可以被選中(默認為YES)
@property(nonatomic)BOOLallowsSelection;
設置cell編輯模式下是否可以被選中
@property(nonatomic)BOOLallowsSelectionDuringEditing;
設置是否支持多選
@property(nonatomic)BOOLallowsMultipleSelection;
設置編輯模式下是否支持多選
@property(nonatomic)BOOLallowsMultipleSelectionDuringEditing;
六、選中cell的相關操作
獲取選中cell的位置信息
- (NSIndexPath*)indexPathForSelectedRow;
獲取多選cell的位置信息
- (NSArray*)indexPathsForSelectedRows;
代碼手動選中與取消選中某行
- (void)selectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated;
注意:這兩個方法將不會回調代理中的方法。
七、tableView附件的相關方法
設置索引欄最小顯示行數
@property(nonatomic)NSIntegersectionIndexMinimumDisplayRowCount;
設置索引欄字體顏色
@property(nonatomic,retain)UIColor*sectionIndexColor;
設置索引欄背景顏色
@property(nonatomic,retain)UIColor*sectionIndexBackgroundColor;
設置索引欄被選中時的顏色
@property(nonatomic,retain)UIColor*sectionIndexTrackingBackgroundColor;
設置分割線的風格
@property(nonatomic)UITableViewCellSeparatorStyleseparatorStyle;
這個風格是一個枚舉,如下:
typedefNS_ENUM(NSInteger,?UITableViewCellSeparatorStyle)?{
UITableViewCellSeparatorStyleNone,//無線
UITableViewCellSeparatorStyleSingleLine,//有線
UITableViewCellSeparatorStyleSingleLineEtched
};
設置分割線顏色
@property(nonatomic,retain)UIColor*separatorColor;
設置分割線毛玻璃效果(IOS8之后可用)
@property(nonatomic,copy)UIVisualEffect*separatorEffect;
注意:這個屬性是IOS8之后新的。
設置tableView頭視圖
@property(nonatomic,retain)UIView*tableHeaderView;
設置tableView尾視圖
@property(nonatomic,retain)UIView*tableFooterView;
從復用池中取cell
- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier;
獲取一個已注冊的cell
- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier forIndexPath:(NSIndexPath*)indexPath
從復用池獲取頭視圖或尾視圖
- (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString*)identifier;
通過xib文件注冊cell
- (void)registerNib:(UINib*)nib forCellReuseIdentifier:(NSString*)identifier;
通過OC類注冊cell
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString*)identifier
上面兩個方法是IOS6之后的方法。
通過xib文件和OC類獲取注冊頭視圖和尾視圖
- (void)registerNib:(UINib*)nib forHeaderFooterViewReuseIdentifier:(NSString*)identifier;
- (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString*)
二、UITableViewDataSourc(數據源代理)
1、必須實現的回調方法
返回每個分區的行數
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
返回每一行的cell
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
2、可選實現的方法
返回分區數(默認為1)
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView;
返回每個分區頭部的標題
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section;
返回每個分區的尾部標題
- (NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section;
設置某行是否可編輯
- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath;
設置某行是否可以被移動
- (BOOL)tableView:(UITableView*)tableView canMoveRowAtIndexPath:(NSIndexPath*)indexPath;
設置索引欄標題數組(實現這個方法,會在tableView右邊顯示每個分區的索引)
- (NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView;
設置索引欄標題對應的分區
- (NSInteger)tableView:(UITableView*)tableView sectionForSectionIndexTitle:(NSString*)title atIndex:(NSInteger)index
tableView接受編輯時調用的方法
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath;
這個方法中的editingStyle參數是一個枚舉,代表了cell被編輯的模式,如下:
typedefNS_ENUM(NSInteger,?UITableViewCellEditingStyle)?{
UITableViewCellEditingStyleNone,//沒有編輯操作
UITableViewCellEditingStyleDelete,//刪除操作
UITableViewCellEditingStyleInsert//插入操作
};
tableView的cell被移動時調用的方法
- (void)tableView:(UITableView*)tableView moveRowAtIndexPath:(NSIndexPath*)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath;
三、UITableViewDelegate(tableView代理)
cell將要顯示時調用的方法
- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath;
頭視圖將要顯示時調用的方法
- (void)tableView:(UITableView*)tableView willDisplayHeaderView:(UIView*)view forSection:(NSInteger)section;
尾視圖將要顯示時調用的方法
- (void)tableView:(UITableView*)tableView willDisplayFooterView:(UIView*)view forSection:(NSInteger)section;
和上面的方法對應,這三個方法分別是cell,頭視圖,尾視圖已經顯示時調用的方法
- (void)tableView:(UITableView*)tableView didEndDisplayingCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didEndDisplayingHeaderView:(UIView*)view forSection:(NSInteger)section;
- (void)tableView:(UITableView*)tableView didEndDisplayingFooterView:(UIView*)view forSection:(NSInteger)section;
設置行高,頭視圖高度和尾視圖高度的方法
- (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;
- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForFooterInSection:(NSInteger)section;
設置自定義頭視圖和尾視圖
- (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section;
- (UIView*)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section;
設置cell是否可以高亮
- (BOOL)tableView:(UITableView*)tableView shouldHighlightRowAtIndexPath:(NSIndexPath*)indexPath;
cell高亮和取消高亮時分別調用的函數
- (void)tableView:(UITableView*)tableView didHighlightRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didUnhighlightRowAtIndexPath:(NSIndexPath*)indexPath;
當即將選中某行和取消選中某行時調用的函數,返回一直位置,執行選中或者取消選中
- (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- (NSIndexPath*)tableView:(UITableView*)tableView willDeselectRowAtIndexPath:(NSIndexPath*)indexPath;
已經選中和已經取消選中后調用的函數
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath;
設置tableView被編輯時的狀態風格,如果不設置,默認都是刪除風格
- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath;
自定義刪除按鈕的標題
- (NSString*)tableView:(UITableView*)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath*)indexPath;
下面這個方法是IOS8中的新方法,用于自定義創建tableView被編輯時右邊的按鈕,按鈕類型為UITableViewRowAction。
- (NSArray*)tableView:(UITableView*)tableView editActionsForRowAtIndexPath:(NSIndexPath*)indexPath?;
設置編輯時背景是否縮進
- (BOOL)tableView:(UITableView*)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath*)indexPath;
將要編輯和結束編輯時調用的方法
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath*)indexPath;
移動特定的某行
- (NSIndexPath*)tableView:(UITableView*)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath*)sourceIndexPath toProposedIndexPath:(NSIndexPath*)proposedDestinationIndexPath;