在iOS開(kāi)發(fā)中坦报,UITableView是使用非常 廣泛的控件上煤,我們平時(shí)使用的很多軟件中到處都可以看到它的影子休玩,常見(jiàn)的像手機(jī)中的設(shè)置,生活中的QQ,微信等劫狠,都可以使用UITableView來(lái)實(shí)現(xiàn)拴疤。下面就簡(jiǎn)單的說(shuō)明一下UITableView的一些特性和使用方式。
一:什么是UITableView
1.UITableView繼承自UIScrollView独泞,所以可以滾動(dòng)(只支持垂直滾動(dòng))查看里面展示的內(nèi)容呐矾。在iOS開(kāi)發(fā)中,UITableView是展示大量?jī)?nèi)容的首選
2.一般來(lái)說(shuō)進(jìn)行大量的有規(guī)則排列的數(shù)據(jù)首先考慮使用UITableView
3.UITableView具有重用和延遲加載等特性懦砂,可以有效的提高效率(它并不會(huì)一次性的將所有數(shù)據(jù)進(jìn)行加載蜒犯,而只是加載當(dāng)前視圖中可見(jiàn)的數(shù)據(jù))
4.UITableView的每一行數(shù)據(jù)就是一個(gè)UITableViewCell,UITableView只能有一列數(shù)據(jù)(cell)组橄,且只支持縱向滑動(dòng),當(dāng)創(chuàng)建好的tablView第一次顯示的時(shí)候愧薛,我們需要調(diào)用其reloadData方法晨炕,使tableView的數(shù)據(jù)更新到最新?tīng)顟B(tài)。
二:UITableView的幾個(gè)重要屬性
1.datasource:是UITableViewDataSource類型毫炉,主要為UITableView提供顯示用的數(shù)據(jù)瓮栗,指定UITableViewCell支持的編輯操作類型(insert,delete和reordering)瞄勾,并根據(jù)用戶的操作進(jìn)行相應(yīng)的數(shù)據(jù)更新操作
2.delegate:是UITableViewDelegate類型费奸,主要提供一些可選的方法,用來(lái)控制tableView的選擇进陡、指定section的頭和尾的顯示
3.rowHeight:設(shè)置每一行數(shù)據(jù)的高度
4.UITableView的style屬性:
? ? a)plain:不分組愿阐,所有數(shù)據(jù)都屬于同一個(gè)組
? ? b)grouped:分組,會(huì)顯示有默認(rèn)的頭部塊和底部塊
? ? c)這里說(shuō)明 一下style屬性的設(shè)置趾疚,如果是手動(dòng)拖拽控件的方式添加UITableView缨历,那么只能通過(guò)style屬性進(jìn)行設(shè)置,如果是代碼創(chuàng)建UITableView糙麦,那么可以在創(chuàng)建的時(shí)候調(diào)用initWithFrame:<#(CGRect)#> style:<#(UITableViewStyle)#>來(lái)進(jìn)行style的設(shè)置辛孵。
一般情況下我們會(huì)設(shè)置當(dāng)前控制器為UITableView的datasource和delegate,理由:根據(jù)MVC設(shè)計(jì)模式,view是與controller進(jìn)行交互的赡磅。而UITableView是View魄缚,UIViewController是Controller,所以展示數(shù)據(jù)的view需要數(shù)據(jù)就會(huì)調(diào)用controller的數(shù)據(jù)源方法獲取數(shù)據(jù)焚廊,而不會(huì)去關(guān)注數(shù)據(jù)如何獲取冶匹。簡(jiǎn)單的說(shuō),在UITableView中咆瘟,在要展示數(shù)據(jù)的時(shí)候嚼隘,就會(huì)詢問(wèn)它的數(shù)據(jù)源到底需要顯示多少組數(shù)據(jù),每一組數(shù)據(jù)中有幾行數(shù)據(jù)搞疗,每一行數(shù)據(jù)具體的內(nèi)容是什么嗓蘑,控制器就負(fù)責(zé)實(shí)現(xiàn)這些方法,而UITableView只負(fù)責(zé)顯示匿乃。控制器負(fù)責(zé)獲取數(shù)據(jù)豌汇,UITableView負(fù)責(zé)展示幢炸,這就是mvc的好處。
在展示大量數(shù)據(jù)的時(shí)候我們需要考慮:1.全部的數(shù)據(jù)一共可以分為多少組2.每一組有多少條數(shù)據(jù)3每一條數(shù)據(jù)的具體內(nèi)容是什么拒贱⊥鸹玻基于這三點(diǎn)我們需要掌握下面數(shù)據(jù)源方法
1.-(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView:這個(gè)方法用來(lái)確定當(dāng)前UITableView一共有幾組數(shù)據(jù)佛嬉,如果沒(méi)有實(shí)現(xiàn)這個(gè)數(shù)據(jù)源方法,那么系統(tǒng)默認(rèn)只有一組數(shù)據(jù)闸天,也就意味著這個(gè)方法默認(rèn)返回1.如果有多組數(shù)據(jù)暖呕,那么就需要在這個(gè)方法里面進(jìn)行確定。
2.-(NSInteger)tableView:(UITableView?*)tableView?numberOfRowsInSection:(NSInteger)section:這個(gè)方法確定在對(duì)應(yīng)的組中有幾條(行)數(shù)據(jù)苞氮,必須在實(shí)現(xiàn)這個(gè)方法湾揽,否則數(shù)據(jù)無(wú)法顯示。當(dāng)每一次創(chuàng)建組的時(shí)候都會(huì)調(diào)用這個(gè)方法確定該組的數(shù)據(jù)行數(shù)量笼吟。
3.-?(UITableViewCell?*)tableView:(UITableView?*)tableView?cellForRowAtIndexPath:(NSIndexPath?*)indexPath;這個(gè)方法確定某個(gè)組中某一行顯示的具體的內(nèi)容库物,在UITableView中,真正的數(shù)據(jù)顯示在cell中贷帮,所以為cell的某些屬性賦值才能真正的讓數(shù)據(jù)展示出來(lái)戚揭。在創(chuàng)建每一組每一行顯示的數(shù)據(jù)的時(shí)候都會(huì)調(diào)用這個(gè)方法,這是必須實(shí)現(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的三個(gè)默認(rèn)成員:
a)imageView:默認(rèn)在最左邊顯示的小圖像潜必,可以不設(shè)置,如果沒(méi)有則不顯示圖片
b)textLabel:顯示的文本沟绪,一般情況下顯示的文本都是使用這個(gè)屬性
c)detailTextLabel:顯示的詳細(xì)介紹刮便,一般字體大小比textLabel小,如果不設(shè)置則不顯示绽慈。
d)圖示:
這是一個(gè)只讀屬性恨旱,只有在創(chuàng)建的時(shí)候可以設(shè)置。
a)UITableViewCellStyleDefault:該格式提供了一個(gè)簡(jiǎn)單的左對(duì)齊的文本標(biāo)簽textLabel和一個(gè)可選的圖像imageView坝疼。如果顯示圖像搜贤,那么圖像將在最左邊。這種格式雖然可以設(shè)置detailTextLabel钝凶,但是不會(huì)顯示該標(biāo)簽仪芒。
b)UITableViewCellStyleSubtitle:該格式與前一種相比,增加了對(duì)detailTextLabel的支持耕陷,該標(biāo)簽將會(huì)顯示在textLabel標(biāo)簽的下面掂名,字體相對(duì)較小。
c)UITableViewCellStyleValue1:該格式居左顯示textLabel哟沫,居右顯示detailTextLabel饺蔑,且字體較小
d)UITableViewCellStyleValue2:該格式居左現(xiàn)實(shí)一個(gè)小型藍(lán)色主標(biāo)簽textLabel,在其右邊顯示一個(gè)小型黑色副標(biāo)題詳細(xì)標(biāo)簽detailTextLabel嗜诀,該格式不支持圖像
e)圖例:
六:UITableViewCell的accessoryType屬性
a)UITableViewCellAccessoryNone;//cell沒(méi)有任何的樣式
b)UITableViewCellAccessoryDisclosureIndicator;//cell的右邊有一個(gè)小箭頭猾警,距離右邊有十幾像素
c)UITableViewCellAccessoryDetailDisclosureButton;//cell右邊有一個(gè)藍(lán)色的圓形button和一個(gè)>
d)UITableViewCellAccessoryDetailButton://cell右邊有一個(gè)小圓圈孔祸,里面有倒立的嘆號(hào)
e)UITableViewCellAccessoryCheckmark;//cell右邊的形狀是對(duì)號(hào)
七:cell的優(yōu)化:
a)為什么需要優(yōu)化:iOS設(shè)備的內(nèi)存有限,如果用UITableView顯示成千上萬(wàn)條數(shù)據(jù)发皿,就需要成千上萬(wàn)個(gè)UITableViewCell對(duì)象的話崔慧,那將會(huì)耗盡iOS設(shè)備的內(nèi)存。要解決該問(wèn)題穴墅,需要重用UITableViewCell對(duì)象
b)優(yōu)化原理:當(dāng)滾動(dòng)列表時(shí)惶室,部分UITableViewCell會(huì)移出窗口,UITableView會(huì)將窗口外的UITableViewCell放入一個(gè)對(duì)象池中封救,等待重用拇涤。當(dāng)UITableView要求dataSource返回UITableViewCell時(shí),dataSource會(huì)先查看這個(gè)對(duì)象池誉结,如果池中有未使用的UITableViewCell鹅士,dataSource會(huì)用新的數(shù)據(jù)配置這個(gè)UITableViewCell,然后返回給UITableView惩坑,重新顯示到窗口中掉盅,從而避免創(chuàng)建新對(duì)象,這就節(jié)省了創(chuàng)建新對(duì)象的時(shí)間以舒,也避免了反復(fù)的內(nèi)存分配及開(kāi)銷趾痘。
c)如何進(jìn)行cell的重用:可以在初始化UITableViewCell的時(shí)候傳入一個(gè)特定的字符串標(biāo)識(shí)來(lái)設(shè)置reuseIdentifier(一般用UITableViewCell的類名)。當(dāng)UITableView要求dataSource返回UITableViewCell時(shí)蔓钟,先通過(guò)一個(gè)字符串標(biāo)識(shí)到對(duì)象池中查找對(duì)應(yīng)類型的UITableViewCell對(duì)象永票,如果有,就重用滥沫,如果沒(méi)有侣集,就傳入這個(gè)字符串標(biāo)識(shí)來(lái)初始化一個(gè)UITableViewCell對(duì)象,以便下一次重用兰绣。
八:重用案例示例:
//數(shù)據(jù)源方法:創(chuàng)建cell
- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
//定義重用標(biāo)識(shí)
NSString*ID=@"hero";
//從緩存中創(chuàng)建cell,而不是直接創(chuàng)建一個(gè)新的cell,查找緩存世分,如果緩存中存在可被重用的cell,那么就不會(huì)再重新創(chuàng)建cell,避免了反復(fù)的創(chuàng)建和回收缀辩,節(jié)省資源
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:ID];
//緩存中有可能并不存在可被重用的cell(如第一次創(chuàng)建的時(shí)候)臭埋,所以判斷如果沒(méi)有從緩存中獲取可重用的cell,那么就創(chuàng)建一個(gè)新的cell
if(cell==nil)
{
//創(chuàng)建cell樣式選擇UITableViewCellStyleSubtitle的原因是還需要顯示圖片和詳細(xì)說(shuō)明信息reuseIdentifier是為當(dāng)前創(chuàng)建的cell設(shè)置標(biāo)識(shí),方便下一次的重用
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ì)說(shuō)明信息文本
cell.detailTextLabel.text=hero.intro;
//返回創(chuàng)建好的cell
returncell;
}
UITableView還有一些常用的代理方法臀玄,用于數(shù)據(jù)的相關(guān)操作瓢阴,之后的文章里會(huì)做出說(shuō)明。