工做了將近兩個月,共接手兩個項目,在項目中用的最多的就是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{ }
參考連接: