UITableView的基本使用

在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的好處。


三:UITableView常用數(shù)據(jù)源方法

在展示大量數(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)圖示:


五:UITableViewCell的樣式(style)

這是一個(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ō)明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末健无,一起剝皮案震驚了整個(gè)濱河市炫掐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬涧,老刑警劉巖募胃,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異畦浓,居然都是意外死亡痹束,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)讶请,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祷嘶,“玉大人,你說(shuō)我怎么就攤上這事夺溢÷畚。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵风响,是天一觀的道長(zhǎng)嘉汰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)状勤,這世上最難降的妖魔是什么鞋怀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮持搜,結(jié)果婚禮上密似,老公的妹妹穿的比我還像新娘。我一直安慰自己葫盼,他們只是感情好残腌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贫导,像睡著了一般抛猫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脱盲,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天邑滨,我揣著相機(jī)與錄音,去河邊找鬼钱反。 笑死掖看,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的面哥。 我是一名探鬼主播哎壳,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尚卫!你這毒婦竟也來(lái)了归榕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吱涉,失蹤者是張志新(化名)和其女友劉穎刹泄,沒(méi)想到半個(gè)月后外里,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡特石,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年盅蝗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姆蘸。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墩莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞敷,到底是詐尸還是另有隱情狂秦,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布推捐,位于F島的核電站裂问,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玖姑。R本人自食惡果不足惜愕秫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焰络。 院中可真熱鬧戴甩,春花似錦、人聲如沸闪彼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畏腕。三九已至缴川,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間描馅,已是汗流浹背把夸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铭污,地道東北人恋日。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嘹狞,于是被迫代替她去往敵國(guó)和親岂膳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容