IOS中UITableView使用總結

 

IOS中UITableView使用總結

一、初始化方法

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;   

這個方法初始化表視圖的frame大小並且設置一個風格,UITableViewStyle是一個枚舉,如下:

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,                  // 標準的表視圖風格
    UITableViewStyleGrouped                 // 分組的表視圖風格
};

二、常用屬性

獲取表視圖的風格(只讀屬性)

@property (nonatomicreadonlyUITableViewStyle           style;

設置表示圖代理和數據源代理(代理方法後面討論)

@property (nonatomicassign)   id <UITableViewDataSource> dataSource;

@property (nonatomicassign)   id <UITableViewDelegate>   delegate;

設置表示圖的行高(默認爲44)

@property (nonatomic)CGFloat rowHeight;  

設置分區的頭視圖高度和尾視圖高度(當代理方法沒有實現時纔有效)

@property (nonatomic)          CGFloat                     sectionHeaderHeight;    

@property (nonatomic)          CGFloat                     sectionFooterHeight;  


設置一個行高的估計值(默認爲0,表示沒有估計,7.0之後可用)

@property (nonatomic)          CGFloat                     estimatedRowHeight;  

注意:這個屬性官方的解釋是如果你的tableView的行高是可變的,那麼設計一個估計高度可以加快代碼的運行效率。

下面這兩個屬性和上面相似,分別設置分區頭視圖和尾視圖的估計高度(7.0之後可用)

@property (nonatomicCGFloat estimatedSectionHeaderHeight; 

 @property (nonatomic)CGFloat  estimatedSectionFooterHeight; 

設置分割線的位置

@property (nonatomic)          UIEdgeInsets                separatorInset; 

如果細心,你可能會發現系統默認的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(nonatomicreadwriteretainUIView *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參數決定定位的相對位置,它使一個枚舉,如下:

typedef NS_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參數是一個枚舉,枚舉的動畫類型如下

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:UITableViewRowAnimationLeft];
    [dataArray removeObjectAtIndex:1];
    [tab endUpdates];

注意:不要在這個塊中調用reloadData這個方法,它會使動畫失效。

//例如:

//一個section刷新

 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2]; 

[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic]; //自動添加動畫

//一個cell刷新

 NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0]; 

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];



五、tableView的編輯操作

設置是否是編輯狀態(編輯狀態下的cell左邊會出現一個減號,點擊右邊會劃出刪除按鈕)

@property (nonatomicgetter=isEditing) BOOL editing;                              

- (void)setEditing:(BOOL)editing animated:(BOOL)animated; 

設置cell是否可以被選中(默認爲YES)

@property (nonatomicBOOL allowsSelection;

設置cell編輯模式下是否可以被選中

@property (nonatomicBOOL allowsSelectionDuringEditing;   

設置是否支持多選

@property (nonatomicBOOL allowsMultipleSelection; 

設置編輯模式下是否支持多選

@property (nonatomicBOOL allowsMultipleSelectionDuringEditing; 

六、選中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 (nonatomicNSIntegersectionIndexMinimumDisplayRowCount;                                                       

設置索引欄字體顏色

@property (nonatomicretainUIColor *sectionIndexColor; 

設置索引欄背景顏色

@property (nonatomicretainUIColor*sectionIndexBackgroundColor; 

設置索引欄被選中時的顏色

@property (nonatomicretainUIColor*sectionIndexTrackingBackgroundColor; 

設置分割線的風格

@property (nonatomicUITableViewCellSeparatorStyleseparatorStyle;

這個風格是一個枚舉,如下:

typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
    UITableViewCellSeparatorStyleNone,//無線
    UITableViewCellSeparatorStyleSingleLine,//有線
    UITableViewCellSeparatorStyleSingleLineEtched  
};

設置分割線顏色

@property (nonatomicretainUIColor           *separatorColor; 

設置分割線毛玻璃效果(IOS8之後可用)

@property (nonatomiccopyUIVisualEffect      *separatorEffect; 

注意:這個屬性是IOS8之後新的。

設置tableView頭視圖

@property (nonatomicretainUIView *tableHeaderView;   

設置tableView尾視圖

@property (nonatomicretainUIView *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 *)

來自:http://www.open-open.com/lib/view/open1430008922468.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章