IOS中UITableView使用總結(jié)
一命雀、初始化方法
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;
這個方法初始化表視圖的frame大小并且設(shè)置一個風(fēng)格,UITableViewStyle是一個枚舉遣总,如下:
typedefNS_ENUM(NSInteger,?UITableViewStyle)?{
UITableViewStylePlain,//?標(biāo)準(zhǔn)的表視圖風(fēng)格
UITableViewStyleGrouped//?分組的表視圖風(fēng)格
};
二盏混、常用屬性
獲取表視圖的風(fēng)格(只讀屬性)
@property(nonatomic,readonly)UITableViewStylestyle;
設(shè)置表示圖代理和數(shù)據(jù)源代理(代理方法后面討論)
@property(nonatomic,assign)id dataSource;
@property(nonatomic,assign)id ? delegate;
設(shè)置表示圖的行高(默認為44)
@property(nonatomic)CGFloatrowHeight;
設(shè)置分區(qū)的頭視圖高度和尾視圖高度(當(dāng)代理方法沒有實現(xiàn)時才有效)
@property(nonatomic)CGFloatsectionHeaderHeight;
@property(nonatomic)CGFloatsectionFooterHeight;
設(shè)置一個行高的估計值(默認為0构眯,表示沒有估計,7.0之后可用)
@property(nonatomic)CGFloatestimatedRowHeight;
注意:這個屬性官方的解釋是如果你的tableView的行高是可變的,那么設(shè)計一個估計高度可以加快代碼的運行效率丰捷。
下面這兩個屬性和上面相似忠烛,分別設(shè)置分區(qū)頭視圖和尾視圖的估計高度(7.0之后可用)
@property(nonatomic)CGFloatestimatedSectionHeaderHeight;@property(nonatomic)CGFloatestimatedSectionFooterHeight;
設(shè)置分割線的位置
@property(nonatomic)UIEdgeInsetsseparatorInset;
如果細心属提,你可能會發(fā)現(xiàn)系統(tǒng)默認的tableView的分割線左端并沒有頂?shù)竭呇亍Mㄟ^這個屬性美尸,可以手動設(shè)置分割線的位置偏移冤议,比如你向讓tableView的分割線只顯示右半邊,可以如下設(shè)置:
UITableView?*?tab?=?[[UITableView?alloc]initWithFrame:self.view.frame?style:UITableViewStylePlain];
tab.separatorInset=UIEdgeInsetsMake(0,?tab.frame.size.width/2,?0,0);
設(shè)置tableView背景view視圖
@property(nonatomic,readwrite,retain)UIView*backgroundView;
三师坎、常用方法詳解
重載tableView
- (void)reloadData;
重載索引欄
- (void)reloadSectionIndexTitles;
這個方法常用語新加或者刪除了索引類別而無需刷新整個表視圖的情況下恕酸。
獲取分區(qū)數(shù)
- (NSInteger)numberOfSections;
根據(jù)分區(qū)獲取行數(shù)
- (NSInteger)numberOfRowsInSection:(NSInteger)section;
獲取分區(qū)的大小(包括頭視圖,所有行和尾視圖)
- (CGRect)rectForSection:(NSInteger)section;
根據(jù)分區(qū)分別獲取頭視圖胯陋,尾視圖和行的高度
- (CGRect)rectForHeaderInSection:(NSInteger)section;
- (CGRect)rectForFooterInSection:(NSInteger)section;
- (CGRect)rectForRowAtIndexPath:(NSIndexPath*)indexPath;
獲取某個點在tableView中的位置信息
- (NSIndexPath*)indexPathForRowAtPoint:(CGPoint)point;
獲取某個cell在tableView中的位置信息
- (NSIndexPath*)indexPathForCell:(UITableViewCell*)cell;
根據(jù)一個矩形范圍返回一個信息數(shù)組蕊温,數(shù)組中是每一行row的位置信息
- (NSArray*)indexPathsForRowsInRect:(CGRect)rect;
通過位置路徑獲取cell
- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath;
獲取所有可見的cell
- (NSArray*)visibleCells;
獲取所有可見行的位置信息
- (NSArray*)indexPathsForVisibleRows;
根據(jù)分區(qū)獲取頭視圖
- (UITableViewHeaderFooterView*)headerViewForSection:(NSInteger)section;
根據(jù)分區(qū)獲取尾視圖
- (UITableViewHeaderFooterView*)footerViewForSection:(NSInteger)section;
使表示圖定位到某一位置(行)
- (void)scrollToRowAtIndexPath:(NSIndexPath*)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
注意:indexPah參數(shù)是定位的位置,決定于分區(qū)和行號遏乔。animated參數(shù)決定是否有動畫义矛。scrollPosition參數(shù)決定定位的相對位置,它使一個枚舉按灶,如下:
typedefNS_ENUM(NSInteger,?UITableViewScrollPosition)?{
UITableViewScrollPositionNone,//同UITableViewScrollPositionTop
UITableViewScrollPositionTop,//定位完成后症革,將定位的行顯示在tableView的頂部
UITableViewScrollPositionMiddle,//定位完成后筐咧,將定位的行顯示在tableView的中間
UITableViewScrollPositionBottom//定位完成后鸯旁,將定位的行顯示在tableView最下面
};
使表示圖定位到選中行
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
這個函數(shù)與上面的非常相似,只是它是將表示圖定位到選中的行量蕊。
四铺罢、tableView操作刷新塊的應(yīng)用
在介紹動畫塊之前,我們先看幾個函數(shù):
插入分區(qū)
- (void)insertSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;
animation參數(shù)是一個枚舉残炮,枚舉的動畫類型如下
typedefNS_ENUM(NSInteger,?UITableViewRowAnimation)?{
UITableViewRowAnimationFade,//淡入淡出
UITableViewRowAnimationRight,//從右滑入
UITableViewRowAnimationLeft,//從左滑入
UITableViewRowAnimationTop,//從上滑入
UITableViewRowAnimationBottom,//從下滑入
UITableViewRowAnimationNone,//沒有動畫
UITableViewRowAnimationMiddle,
UITableViewRowAnimationAutomatic?=?100//?自動選擇合適的動畫
};
刪除分區(qū)
- (void)deleteSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;
重載一個分區(qū)
- (void)reloadSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation ;
移動一個分區(qū)
- (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;
了解了上面幾個函數(shù)韭赘,我們來看什么是操作刷新塊:
當(dāng)我們調(diào)用的上面的函數(shù)時,tableView會立刻調(diào)用代理方法進行刷新势就,如果其中我們所做的操作是刪除某行泉瞻,而然數(shù)據(jù)源數(shù)組我們可能并沒有刷新,程序就會崩潰掉苞冯,原因是代理返回的信息和我們刪除后不符袖牙。
IOS為我們提供了下面兩個函數(shù)解決這個問題:
開始塊標(biāo)志
- (void)beginUpdates;
結(jié)束快標(biāo)志
- (void)endUpdates;
我們可以將我們要做的操作全部寫在這個塊中,那么舅锄,只有當(dāng)程序執(zhí)行到結(jié)束快標(biāo)志后鞭达,才會調(diào)用代理刷新方法。代碼示例如下:
[tab?beginUpdates];
[tab?deleteRowsAtIndexPaths:@[[NSIndexPath?indexPathForRow:1?inSection:0]]?withRowAnimation:UITableViewRowAnimationLeft];
[dataArray?removeObjectAtIndex:1];
[tab?endUpdates];
注意:不要在這個塊中調(diào)用reloadData這個方法,它會使動畫失效畴蹭。
五坦仍、tableView的編輯操作
設(shè)置是否是編輯狀態(tài)(編輯狀態(tài)下的cell左邊會出現(xiàn)一個減號,點擊右邊會劃出刪除按鈕)
@property(nonatomic,getter=isEditing)BOOLediting;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
設(shè)置cell是否可以被選中(默認為YES)
@property(nonatomic)BOOLallowsSelection;
設(shè)置cell編輯模式下是否可以被選中
@property(nonatomic)BOOLallowsSelectionDuringEditing;
設(shè)置是否支持多選
@property(nonatomic)BOOLallowsMultipleSelection;
設(shè)置編輯模式下是否支持多選
@property(nonatomic)BOOLallowsMultipleSelectionDuringEditing;
六叨襟、選中cell的相關(guān)操作
獲取選中cell的位置信息
- (NSIndexPath*)indexPathForSelectedRow;
獲取多選cell的位置信息
- (NSArray*)indexPathsForSelectedRows;
代碼手動選中與取消選中某行
- (void)selectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated;
注意:這兩個方法將不會回調(diào)代理中的方法繁扎。
七、tableView附件的相關(guān)方法
設(shè)置索引欄最小顯示行數(shù)
@property(nonatomic)NSIntegersectionIndexMinimumDisplayRowCount;
設(shè)置索引欄字體顏色
@property(nonatomic,retain)UIColor*sectionIndexColor;
設(shè)置索引欄背景顏色
@property(nonatomic,retain)UIColor*sectionIndexBackgroundColor;
設(shè)置索引欄被選中時的顏色
@property(nonatomic,retain)UIColor*sectionIndexTrackingBackgroundColor;
設(shè)置分割線的風(fēng)格
@property(nonatomic)UITableViewCellSeparatorStyleseparatorStyle;
這個風(fēng)格是一個枚舉芹啥,如下:
typedefNS_ENUM(NSInteger,?UITableViewCellSeparatorStyle)?{
UITableViewCellSeparatorStyleNone,//無線
UITableViewCellSeparatorStyleSingleLine,//有線
UITableViewCellSeparatorStyleSingleLineEtched
};
設(shè)置分割線顏色
@property(nonatomic,retain)UIColor*separatorColor;
設(shè)置分割線毛玻璃效果(IOS8之后可用)
@property(nonatomic,copy)UIVisualEffect*separatorEffect;
注意:這個屬性是IOS8之后新的锻离。
設(shè)置tableView頭視圖
@property(nonatomic,retain)UIView*tableHeaderView;
設(shè)置tableView尾視圖
@property(nonatomic,retain)UIView*tableFooterView;
從復(fù)用池中取cell
- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier;
獲取一個已注冊的cell
- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier forIndexPath:(NSIndexPath*)indexPath
從復(fù)用池獲取頭視圖或尾視圖
- (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(數(shù)據(jù)源代理)
1汽纠、必須實現(xiàn)的回調(diào)方法
返回每個分區(qū)的行數(shù)
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
返回每一行的cell
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
2、可選實現(xiàn)的方法
返回分區(qū)數(shù)(默認為1)
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView;
返回每個分區(qū)頭部的標(biāo)題
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section;
返回每個分區(qū)的尾部標(biāo)題
- (NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section;
設(shè)置某行是否可編輯
- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath;
設(shè)置某行是否可以被移動
- (BOOL)tableView:(UITableView*)tableView canMoveRowAtIndexPath:(NSIndexPath*)indexPath;
設(shè)置索引欄標(biāo)題數(shù)組(實現(xiàn)這個方法傀履,會在tableView右邊顯示每個分區(qū)的索引)
- (NSArray*)sectionIndexTitlesForTableView:(UITableView*)tableView;
設(shè)置索引欄標(biāo)題對應(yīng)的分區(qū)
- (NSInteger)tableView:(UITableView*)tableView sectionForSectionIndexTitle:(NSString*)title atIndex:(NSInteger)index
tableView接受編輯時調(diào)用的方法
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath;
這個方法中的editingStyle參數(shù)是一個枚舉虱朵,代表了cell被編輯的模式,如下:
typedefNS_ENUM(NSInteger,?UITableViewCellEditingStyle)?{
UITableViewCellEditingStyleNone,//沒有編輯操作
UITableViewCellEditingStyleDelete,//刪除操作
UITableViewCellEditingStyleInsert//插入操作
};
tableView的cell被移動時調(diào)用的方法
- (void)tableView:(UITableView*)tableView moveRowAtIndexPath:(NSIndexPath*)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath;
三钓账、UITableViewDelegate(tableView代理)
cell將要顯示時調(diào)用的方法
- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath;
頭視圖將要顯示時調(diào)用的方法
- (void)tableView:(UITableView*)tableView willDisplayHeaderView:(UIView*)view forSection:(NSInteger)section;
尾視圖將要顯示時調(diào)用的方法
- (void)tableView:(UITableView*)tableView willDisplayFooterView:(UIView*)view forSection:(NSInteger)section;
和上面的方法對應(yīng)碴犬,這三個方法分別是cell,頭視圖梆暮,尾視圖已經(jīng)顯示時調(diào)用的方法
- (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;
設(shè)置行高服协,頭視圖高度和尾視圖高度的方法
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath;
- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section;
設(shè)置行高,頭視圖高度和尾視圖高度的估計值(對于高度可變的情況下啦粹,提高效率)
- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath*)indexPath;
- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView*)tableView estimatedHeightForFooterInSection:(NSInteger)section;
設(shè)置自定義頭視圖和尾視圖
- (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section;
- (UIView*)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section;
設(shè)置cell是否可以高亮
- (BOOL)tableView:(UITableView*)tableView shouldHighlightRowAtIndexPath:(NSIndexPath*)indexPath;
cell高亮和取消高亮?xí)r分別調(diào)用的函數(shù)
- (void)tableView:(UITableView*)tableView didHighlightRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didUnhighlightRowAtIndexPath:(NSIndexPath*)indexPath;
當(dāng)即將選中某行和取消選中某行時調(diào)用的函數(shù)偿荷,返回一直位置,執(zhí)行選中或者取消選中
- (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- (NSIndexPath*)tableView:(UITableView*)tableView willDeselectRowAtIndexPath:(NSIndexPath*)indexPath;
已經(jīng)選中和已經(jīng)取消選中后調(diào)用的函數(shù)
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath;
設(shè)置tableView被編輯時的狀態(tài)風(fēng)格唠椭,如果不設(shè)置跳纳,默認都是刪除風(fēng)格
- (UITableViewCellEditingStyle)tableView:(UITableView*)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath;
自定義刪除按鈕的標(biāo)題
- (NSString*)tableView:(UITableView*)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath*)indexPath;
下面這個方法是IOS8中的新方法,用于自定義創(chuàng)建tableView被編輯時右邊的按鈕贪嫂,按鈕類型為UITableViewRowAction寺庄。
- (NSArray*)tableView:(UITableView*)tableView editActionsForRowAtIndexPath:(NSIndexPath*)indexPath?;
設(shè)置編輯時背景是否縮進
- (BOOL)tableView:(UITableView*)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath*)indexPath;
將要編輯和結(jié)束編輯時調(diào)用的方法
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath*)indexPath;
移動特定的某行
- (NSIndexPath*)tableView:(UITableView*)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath*)sourceIndexPath toProposedIndexPath:(NSIndexPath*)proposedDestinationIndexPath;