UITableView 屬性用法詳解

weixin_34107955發表於2016-07-06
2118720-7a9303fd60a0875a.jpeg
前言: 學iOS也有段時間了,由於當初學的時候沒有基礎,現在反過來看自己一些基礎控制元件的用法都還沒搞清楚,所以想總結一些重要控制元件的用法 -- 本文大部分轉載自 -> 琿少部落格
文章索引
01  tableView 屬性
02  tableView 方法
03  tableView 動畫塊操作
04  tableView 編輯操作
05  tableViewCell 選中相關操作
06 tableView附件的相關方法
07 tableView datasource代理方法
08 tableView delegate代理方法
pragma mark -- 01 tableView 屬性
1.常用屬性
設定表示圖的行高(預設為44)
@property (nonatomic)CGFloat rowHeight;

設定分組樣式時的頭檢視高度和尾檢視高度(當代理方法沒有實現時才有效)
@property (nonatomic)          CGFloat                     sectionHeaderHeight;   
@property (nonatomic)          CGFloat                     sectionFooterHeight; 

設定一個行高的估計值(預設為0,表示沒有估計,7.0之後可用)
@property (nonatomic)          CGFloat                     estimatedRowHeight; 
注意:這個屬性官方的解釋是如果你的tableView的行高是可變的,那麼設計一個估計高度可以加快程式碼的執行效率。
下面這兩個屬性和上面相似,分別設定分割槽頭檢視和尾檢視的估計高度(7.0之後可用)
@property (nonatomic)          CGFloat            estimatedSectionHeaderHeight; 
 @property (nonatomic)          CGFloat            estimatedSectionFooterHeight;

設定分割線的位置
@property (nonatomic)          UIEdgeInsets                separatorInset;
如果細心,你可能會發現系統預設的tableView的分割線左端並沒有頂到邊沿。通過這個屬性,可以手動設定分割線的位置偏移,比如你向讓tableView的分割線只顯示右半邊,可以如下設定:
tableView.separatorInset=UIEdgeInsetsMake(0, tab.frame.size.width/2, 0,0);

設定tableView背景view檢視
@property(nonatomic, readwrite, retain) UIView *backgroundView;
pragma mark -- 02 tableView 方法
重新整理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引數決定定位的相對位置,它使一個列舉,如下:
typedef NS_ENUM(NSInteger, UITableViewScrollPosition)
 {    
UITableViewScrollPositionNone,//同UITableViewScrollPositionTop   
 UITableViewScrollPositionTop,//定位完成後,將定位的行顯示在tableView的頂部      
  UITableViewScrollPositionMiddle,//定位完成後,將定位的行顯示在tableView的中間     
  UITableViewScrollPositionBottom//定位完成後,將定位的行顯示在tableView最下面
};

使表格示圖定位到選中行
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
這個函式與上面的非常相似,只是它是將表示圖定位到選中的行。
pragma mark -- 03 tableView 動畫塊操作
在介紹動畫塊之前,我們先看幾個函式:
插入分割槽
- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
animation引數是一個列舉,列舉的動畫型別如下
typedef NS_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:UITabl eViewRowAnimationLeft];   
 [dataArray removeObjectAtIndex:1];   
 [tab endUpdates];

注意:不要在這個塊中呼叫reloadData這個方法,它會使動畫失效。
pragma mark -- 04 tableView 編輯操作
設定是否是編輯狀態(編輯狀態下的cell左邊會出現一個減號,點選右邊會劃出刪除按鈕)
@property (nonatomic, getter=isEditing) BOOL editing;                             
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

設定cell是否可以被選中(預設為YES)
@property (nonatomic) BOOL allowsSelection;

設定cell編輯模式下是否可以被選中
@property (nonatomic) BOOL allowsSelectionDuringEditing;  

設定是否支援多選
@property (nonatomic) BOOL allowsMultipleSelection;

設定編輯模式下是否支援多選
@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing;
pragma mark -- 05 tableViewCell 選中相關操作
獲取選中cell的位置資訊
- (NSIndexPath *)indexPathForSelectedRow; 

獲取多選cell的位置資訊
- (NSArray *)indexPathsForSelectedRows;

程式碼手動選中與取消選中某行
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;
注意:這兩個方法將不會回撥代理中的方法。
pragma mark -- 06 tableView附件的相關方法
設定索引欄最小顯示行數
@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;                                                      
設定索引欄字型顏色
@property (nonatomic, retain) UIColor *sectionIndexColor;

設定索引欄背景顏色
@property (nonatomic, retain) UIColor *sectionIndexBackgroundColor;

設定索引欄被選中時的顏色
@property (nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor;

設定分割線的風格
@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle;
這個風格是一個列舉,如下:
typedef NS_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 *)
pragma mark -- 07 tableView datasource代理方法
返回每個分割槽的行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

返回每一行的cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

可選實現的方法
返回分割槽數(預設為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被編輯的模式,如下:
typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle)
 {
UITableViewCellEditingStyleNone,//沒有編輯操作
UITableViewCellEditingStyleDelete,//刪除操作
UITableViewCellEditingStyleInsert//插入操作
};

tableView的cell被移動時呼叫的方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
pragma mark -- 08 tableView delegate代理方法
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;  

相關文章