【ios開發】控件細究1:UITableView

      工做了將近兩個月,共接手兩個項目,在項目中用的最多的就是UITableView了,可是也是問題出現的最多的地方,因爲一開始不熟練,致使不少問題花了很長時間才解決。因此利用這兩天空閒時間,好好梳理一下這個控件,但願可以方便之後的開發工做。node

     個人介紹是從我建立UITableView的順序提及。設計模式

1、概述:框架

     UITableView繼承與UIScrollView。這兩個控件的異同點以下:函數

      相同點:UITableView實現了UIScrollView協議,且繼承於UIScrollView,兩個組件均可以滑動。 spa

    相異點:UITableView是逐步加載UITableViewCell,之後每次滾動時,重繪cell;UIScrollView是初始化全部其子視圖,之後每次滾動,再也不重繪其子視圖,因此UITableView滑動起來比較卡,而UIScrollView滑動比較順暢;在數據量比較多的狀況下,應該使用UITableView,由於cell能夠複用,使用內存相對較少,而UIScrollView使用內存較多;另外UITableView能夠刷新數據,reloaddata等,而scrollview的數據是固定的,除非從新初始化。.net

2、建立UITableView設計

    我正常建立UITableView,會把它封裝到一個方法裏面。這樣清楚一點。 代理

    

-(void)initTableView
{
    helpTableView = [[UITableView alloc]initWithFrame:CGRectMake(5, navheight + 7.5, 305, 480) style:UITableViewStyleGrouped];
    helpTableView.delegate = self;
    helpTableView.dataSource = self;
  
    helpTableView.backgroundView = nil;
  [helpTableView setBackgroundColor:[UIColor colorWithRed:231.0/255.0 green:231.0/255.0 blue:231.0/255.0 alpha:1.0]];

    helpTableView.separatorColor = [UIColor clearColor];
    helpTableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    helpTableView.scrollEnabled = NO;
    [self.view addSubview:helpTableView];
[helpTableView release];
}

一、首先介紹第一句代碼,UITableView的style。code

UITableViewStyleGrouped和UITableViewStylePlain的區別我認爲就是UITableViewStyleGrouped背後貼了一層背景圖。可是咱們能夠經過blog

 helpTableView.backgroundView = nil;
  [helpTableView setBackgroundColor:[UIColor colorWithRed:231.0/255.0 green:231.0/255.0 blue:231.0/255.0 alpha:1.0]];

這段代碼來去除背景。而後繪製上你須要的背景色。helpTableView.backgroundView = nil;這句代碼必定要有。

二、dataSource和delegate

      在初始化UITableView的時候必須實現UITableView的是,在.h文件中要繼承UITableViewDelegate和UITableViewDataSource,並實現3個UITableView數據源方法和設置它的delegate爲self,這個是在不直接繼承UITableViewController實現的方法。

      dataSource是UITableViewDataSource類型,主要爲UITableView提供顯示用的數據(UITableViewCell),指定UITableViewCell支持的編輯操做類型(insert,delete和 reordering),並根據用戶的操做進行相應的數據更新操做,若是數據沒有根據操做進行正確的更新,可能會致使顯示異常,甚至crush。

       delegate是UITableViewDelegate類型,主要提供一些可選的方法,用來控制tableView的選擇、指定section的頭和尾的顯示以及協助完成cell的刪除和排序等功能。

       dataSource和delegate他們實際上是Cocoa框架的一種設計模式,叫策略模式,改天能夠另外開一篇博文介紹專門介紹策略模式。

三、UITableView的一些屬性

    關於屬性和一些方法能夠參考這篇文章,講的比較詳細。

3、實現代理必須實現的三個方法。

 一、UITableView有三個必須實現的核心方法,分別以下:

-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView;

這個方法能夠分段顯示或者單個列表顯示咱們的數據。以下,左邊爲分段顯示,右邊爲單個列表顯示:

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;

這個方法返回每一個分段的行數,不一樣分段返回不一樣的行數能夠用switch來作,若是是單個列表就直接返回單個你想要的函數便可。

-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;

這個方法是返回咱們調用的每個單元格。經過咱們索引的路徑的section和row來肯定。

 二、UITableView的委託方法

使用委託是爲了響應用戶的交互動做,好比下拉更新數據和選擇某一行單元格,在UITableView中有很大這種方法供咱們選擇。

//設置Section的數量  
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{  
 return TitleData;  
}  
//設置每一個section顯示的Title  
- (NSString *)tableView:(UITableView *)tableViewtitleForHeaderInSection:(NSInteger)section{  
 return @"Andy-清風";  
}  
  
//指定有多少個分區(Section),默認爲1  
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
 return 2;  
}  
  
//指定每一個分區中有多少行,默認爲1  
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
}  
  
//設置每行調用的cell  
-(UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath {  
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";  
    
    UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:  
                             SimpleTableIdentifier];  
    if (cell == nil) {    
        cell = [[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleDefault  
                                       reuseIdentifier:SimpleTableIdentifier] autorelease];  
 }  
 cell.imageView.image=image;//未選cell時的圖片  
 cell.imageView.highlightedImage=highlightImage;//選中cell後的圖片  
 cell.text=@」Andy-清風」;  
 return cell;  
}  
//設置讓UITableView行縮進  
-(NSInteger)tableView:(UITableView *)tableViewindentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{  
 NSUInteger row = [indexPath row];  
 return row;  
}  
//設置cell每行間隔的高度  
- (CGFloat)tableView:(UITableView *)tableViewheightForRowAtIndexPath:(NSIndexPath *)indexPath{  
    return 40;  
}  
//返回當前所選cell  
NSIndexPath *ip = [NSIndexPath indexPathForRow:row inSection:section];  
[TopicsTable selectRowAtIndexPath:ip animated:YESscrollPosition:UITableViewScrollPositionNone];  
  
//設置UITableView的style  
[tableView setSeparatorStyle:UITableViewCellSelectionStyleNone];  
//設置選中Cell的響應事件  
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{  
  
 [tableView deselectRowAtIndexPath:indexPath animated:YES];//選中後的反顯顏色即刻消失  
}  
  
//設置選中的行所執行的動做  
  
-(NSIndexPath *)tableView:(UITableView *)tableViewwillSelectRowAtIndexPath:(NSIndexPath *)indexPath  
{  
    NSUInteger row = [indexPath row];  
     return indexPath;  
}  
//設置划動cell是否出現del按鈕,可供刪除數據裏進行處理  
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath {  
}  
//設置刪除時編輯狀態  
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle  
forRowAtIndexPath:(NSIndexPath *)indexPath  
{  
}  
//右側添加一個索引表  
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{  
}  

 

 

 

 


參考連接:

http://www.zhouwenyi.com/node/6212

http://www.zhouwenyi.com/node/6218

相關文章
相關標籤/搜索