在iOS開發(fā)中,UITableView是使用非常 廣泛的控件,我們平時使用的很多軟件中到處都可以看到它的影子,常見的像手機中的設(shè)置,生活中的QQ,微信等,都可以使用UITableView來實現(xiàn)。下面就簡單的說明一下UITableView的一些特性和使用方式。
一:什么是UITableView
1.UITableView繼承自UIScrollView,所以可以滾動(只支持垂直滾動)查看里面展示的內(nèi)容。在iOS開發(fā)中,UITableView是展示大量內(nèi)容的首選
2.一般來說進行大量的有規(guī)則排列的數(shù)據(jù)首先考慮使用UITableView
3.UITableView具有重用和延遲加載等特性,可以有效的提高效率(它并不會一次性的將所有數(shù)據(jù)進行加載,而只是加載當(dāng)前視圖中可見的數(shù)據(jù))
4.UITableView的每一行數(shù)據(jù)就是一個UITableViewCell,UITableView只能有一列數(shù)據(jù)(cell),且只支持縱向滑動,當(dāng)創(chuàng)建好的tablView第一次顯示的時候,我們需要調(diào)用其reloadData方法,使tableView的數(shù)據(jù)更新到最新狀態(tài)。
二:UITableView的幾個重要屬性
1.datasource:是UITableViewDataSource類型,主要為UITableView提供顯示用的數(shù)據(jù),指定UITableViewCell支持的編輯操作類型(insert,delete和reordering),并根據(jù)用戶的操作進行相應(yīng)的數(shù)據(jù)更新操作
2.delegate:是UITableViewDelegate類型,主要提供一些可選的方法,用來控制tableView的選擇、指定section的頭和尾的顯示
3.rowHeight:設(shè)置每一行數(shù)據(jù)的高度
4.UITableView的style屬性:
? ? a)plain:不分組,所有數(shù)據(jù)都屬于同一個組
? ? b)grouped:分組,會顯示有默認(rèn)的頭部塊和底部塊
? ? c)這里說明 一下style屬性的設(shè)置,如果是手動拖拽控件的方式添加UITableView,那么只能通過style屬性進行設(shè)置,如果是代碼創(chuàng)建UITableView,那么可以在創(chuàng)建的時候調(diào)用initWithFrame:<#(CGRect)#> style:<#(UITableViewStyle)#>來進行style的設(shè)置。
一般情況下我們會設(shè)置當(dāng)前控制器為UITableView的datasource和delegate,理由:根據(jù)MVC設(shè)計模式,view是與controller進行交互的。而UITableView是View,UIViewController是Controller,所以展示數(shù)據(jù)的view需要數(shù)據(jù)就會調(diào)用controller的數(shù)據(jù)源方法獲取數(shù)據(jù),而不會去關(guān)注數(shù)據(jù)如何獲取。簡單的說,在UITableView中,在要展示數(shù)據(jù)的時候,就會詢問它的數(shù)據(jù)源到底需要顯示多少組數(shù)據(jù),每一組數(shù)據(jù)中有幾行數(shù)據(jù),每一行數(shù)據(jù)具體的內(nèi)容是什么,控制器就負(fù)責(zé)實現(xiàn)這些方法,而UITableView只負(fù)責(zé)顯示。控制器負(fù)責(zé)獲取數(shù)據(jù),UITableView負(fù)責(zé)展示,這就是mvc的好處。
在展示大量數(shù)據(jù)的時候我們需要考慮:1.全部的數(shù)據(jù)一共可以分為多少組2.每一組有多少條數(shù)據(jù)3每一條數(shù)據(jù)的具體內(nèi)容是什么。基于這三點我們需要掌握下面數(shù)據(jù)源方法
1.-(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView:這個方法用來確定當(dāng)前UITableView一共有幾組數(shù)據(jù),如果沒有實現(xiàn)這個數(shù)據(jù)源方法,那么系統(tǒng)默認(rèn)只有一組數(shù)據(jù),也就意味著這個方法默認(rèn)返回1.如果有多組數(shù)據(jù),那么就需要在這個方法里面進行確定。
2.-(NSInteger)tableView:(UITableView?*)tableView?numberOfRowsInSection:(NSInteger)section:這個方法確定在對應(yīng)的組中有幾條(行)數(shù)據(jù),必須在實現(xiàn)這個方法,否則數(shù)據(jù)無法顯示。當(dāng)每一次創(chuàng)建組的時候都會調(diào)用這個方法確定該組的數(shù)據(jù)行數(shù)量。
3.-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath;這個方法確定某個組中某一行顯示的具體的內(nèi)容,在UITableView中,真正的數(shù)據(jù)顯示在cell中,所以為cell的某些屬性賦值才能真正的讓數(shù)據(jù)展示出來。在創(chuàng)建每一組每一行顯示的數(shù)據(jù)的時候都會調(diào)用這個方法,這是必須實現(xiàn)的方法。
4.- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section:設(shè)置頭部文本,返回默認(rèn)樣式的文本
5. - (NSString*)
tableView:(UITableView*)tableViewtitleForFooterInSection:(NSInteger)section:設(shè)置底部文本,返回默認(rèn)樣式的文本。
四:系統(tǒng)自定義cell的三個默認(rèn)成員:
a)imageView:默認(rèn)在最左邊顯示的小圖像,可以不設(shè)置,如果沒有則不顯示圖片
b)textLabel:顯示的文本,一般情況下顯示的文本都是使用這個屬性
c)detailTextLabel:顯示的詳細(xì)介紹,一般字體大小比textLabel小,如果不設(shè)置則不顯示。
d)圖示:
這是一個只讀屬性,只有在創(chuàng)建的時候可以設(shè)置。
a)UITableViewCellStyleDefault:該格式提供了一個簡單的左對齊的文本標(biāo)簽textLabel和一個可選的圖像imageView。如果顯示圖像,那么圖像將在最左邊。這種格式雖然可以設(shè)置detailTextLabel,但是不會顯示該標(biāo)簽。
b)UITableViewCellStyleSubtitle:該格式與前一種相比,增加了對detailTextLabel的支持,該標(biāo)簽將會顯示在textLabel標(biāo)簽的下面,字體相對較小。
c)UITableViewCellStyleValue1:該格式居左顯示textLabel,居右顯示detailTextLabel,且字體較小
d)UITableViewCellStyleValue2:該格式居左現(xiàn)實一個小型藍(lán)色主標(biāo)簽textLabel,在其右邊顯示一個小型黑色副標(biāo)題詳細(xì)標(biāo)簽detailTextLabel,該格式不支持圖像
e)圖例:
六:UITableViewCell的accessoryType屬性
a)UITableViewCellAccessoryNone;//cell沒有任何的樣式
b)UITableViewCellAccessoryDisclosureIndicator;//cell的右邊有一個小箭頭,距離右邊有十幾像素
c)UITableViewCellAccessoryDetailDisclosureButton;//cell右邊有一個藍(lán)色的圓形button和一個>
d)UITableViewCellAccessoryDetailButton://cell右邊有一個小圓圈,里面有倒立的嘆號
e)UITableViewCellAccessoryCheckmark;//cell右邊的形狀是對號
七:cell的優(yōu)化:
a)為什么需要優(yōu)化:iOS設(shè)備的內(nèi)存有限,如果用UITableView顯示成千上萬條數(shù)據(jù),就需要成千上萬個UITableViewCell對象的話,那將會耗盡iOS設(shè)備的內(nèi)存。要解決該問題,需要重用UITableViewCell對象
b)優(yōu)化原理:當(dāng)滾動列表時,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用。當(dāng)UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池,如果池中有未使用的UITableViewCell,dataSource會用新的數(shù)據(jù)配置這個UITableViewCell,然后返回給UITableView,重新顯示到窗口中,從而避免創(chuàng)建新對象,這就節(jié)省了創(chuàng)建新對象的時間,也避免了反復(fù)的內(nèi)存分配及開銷。
c)如何進行cell的重用:可以在初始化UITableViewCell的時候傳入一個特定的字符串標(biāo)識來設(shè)置reuseIdentifier(一般用UITableViewCell的類名)。當(dāng)UITableView要求dataSource返回UITableViewCell時,先通過一個字符串標(biāo)識到對象池中查找對應(yīng)類型的UITableViewCell對象,如果有,就重用,如果沒有,就傳入這個字符串標(biāo)識來初始化一個UITableViewCell對象,以便下一次重用。
八:重用案例示例:
//數(shù)據(jù)源方法:創(chuàng)建cell
- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
//定義重用標(biāo)識
NSString*ID=@"hero";
//從緩存中創(chuàng)建cell,而不是直接創(chuàng)建一個新的cell,查找緩存,如果緩存中存在可被重用的cell,那么就不會再重新創(chuàng)建cell,避免了反復(fù)的創(chuàng)建和回收,節(jié)省資源
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:ID];
//緩存中有可能并不存在可被重用的cell(如第一次創(chuàng)建的時候),所以判斷如果沒有從緩存中獲取可重用的cell,那么就創(chuàng)建一個新的cell
if(cell==nil)
{
//創(chuàng)建cell樣式選擇UITableViewCellStyleSubtitle的原因是還需要顯示圖片和詳細(xì)說明信息reuseIdentifier是為當(dāng)前創(chuàng)建的cell設(shè)置標(biāo)識,方便下一次的重用
cell=[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:ID];
}
//創(chuàng)建cell后為cell賦值
//獲取模型數(shù)據(jù)
WHHero*hero=self.heros[indexPath.row];
//設(shè)置圖像
cell.imageView.image=[UIImageimageNamed:hero.icon];
//設(shè)置文本
cell.textLabel.text=hero.name;
//設(shè)置詳細(xì)說明信息文本
cell.detailTextLabel.text=hero.intro;
//返回創(chuàng)建好的cell
returncell;
}
UITableView還有一些常用的代理方法,用于數(shù)據(jù)的相關(guān)操作,之后的文章里會做出說明。