iOS學(xué)習(xí)筆記03-UITableView

一镀首、UITableView基本介紹

默認(rèn)的UITableView有2種風(fēng)格:
  1. UITableViewStylePlain(不分組)
  2. UITableViewStyleGrouped(分組)

UITableView中的數(shù)據(jù)只有行的概念沒有列的概念,UITableView的每行數(shù)據(jù)就是一個(gè)UITableViewCell廊宪。
自帶的UITableViewCell的類型選擇有:

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,    // 左側(cè)顯示textLabel(不顯示detailTextLabel)脚草,imageView可選(顯示在最左邊)
    UITableViewCellStyleValue1,     // 左側(cè)顯示textLabel乓序、右側(cè)顯示detailTextLabel(默認(rèn)藍(lán)色)批狱,imageView可選(顯示在最左邊)
    UITableViewCellStyleValue2,     // 左側(cè)依次顯示textLabel(默認(rèn)藍(lán)色)和detailTextLabel,imageView可選(顯示在最左邊)
    UITableViewCellStyleSubtitle    // 左上方顯示textLabel梅尤,左下方顯示detailTextLabel(默認(rèn)灰色),imageView可選(顯示在最左邊)
};

二柜思、UITableViewDataSource數(shù)據(jù)源

數(shù)據(jù)源的作用就是告訴UITableView我該顯示什么數(shù)據(jù)

#pragma mark 常用數(shù)據(jù)源方法
#pragma mark 返回分組數(shù)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
#pragma mark 返回每組行數(shù)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
#pragma mark 返回每行的單元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 返回每組頭標(biāo)題名稱
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
#pragma mark 返回每組尾部說明
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

計(jì)算分組數(shù) -> 計(jì)算每組行數(shù) -> 生成分組索引 -> 生成單元格
注意:cellForRowAtIndexPath只生產(chǎn)當(dāng)前顯示在界面上的單元格


三巷燥、UITableViewDelegate代理

代理的作用是告訴UITableView赡盘,我該怎么顯示和響應(yīng)

#pragma mark - 常用代理方法
#pragma mark 設(shè)置分組頭部的內(nèi)容高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
#pragma mark 設(shè)置每行高度(每行高度可以不一樣)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 設(shè)置分組尾部的內(nèi)容高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
#pragma mark 點(diǎn)擊了某一行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 設(shè)置分組的頭部視圖
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
#pragma mark 設(shè)置分組的尾部視圖
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;

四、UITableView刷新列表方法

#pragma mark 刷新整個(gè)表格
- (void)reloadData;
#pragma mark 刷新指定的行
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
#pragma mark 刷新指定的分組
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
#pragma mark 刪除時(shí)刷新指定的行數(shù)據(jù)
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
#pragma mark 添加時(shí)刷新指定的行數(shù)據(jù)
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

五缰揪、UITableViewCell的重用機(jī)制

UITableView內(nèi)部有一個(gè)緩存池陨享,專門用來緩存UITableViewCell,因?yàn)?code>UITableView不是一下子顯示全部Cell钝腺,而是以 所見即所得 的方式抛姑,手機(jī)上看的見的Cell,才有存在的對(duì)象UITableViewCell實(shí)例艳狐。具體表現(xiàn)如下:

  • 每次顯示新的Cell的時(shí)候定硝,都是先從緩存池中取出對(duì)應(yīng)的UITableViewCell對(duì)象,進(jìn)行 重新初始化 顯示毫目。如果緩存池中沒有蔬啡,才創(chuàng)建新的UITableViewCell對(duì)象
  • 每當(dāng)某個(gè)Cell被移出 可見區(qū)域 外后,就會(huì)被 回收 到緩存池中

所以盡管要展示的數(shù)據(jù)巨大镀虐,但內(nèi)存中存在的UITableViewCell也是有限的箱蟆,極大的降低了對(duì)內(nèi)存的需求。

# pragma mark - 在tableView:cellForRowAtIndexPath:方法中使用UITableView的重用機(jī)制
// 由于此方法調(diào)用十分頻繁刮便,cell的標(biāo)示聲明成靜態(tài)變量有利于性能優(yōu)化
static NSString *cellIdentifier = @"UITableViewCellIdentifierKey1";
// 首先根據(jù)標(biāo)識(shí)去緩存池取
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// 如果緩存池沒有找到空猜,則重新創(chuàng)建并放到緩存池中
if(!cell){
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
}

注意:

  • 因?yàn)槭褂昧酥赜脵C(jī)制,你拿到的Cell上面也許本來就有數(shù)據(jù)恨旱,所以一定要對(duì)Cell里的所有子控件進(jìn)行初始化抄肖,否則會(huì)導(dǎo)致Cell數(shù)據(jù)混亂。
  • 比如你第一個(gè)Cell設(shè)置了標(biāo)題窖杀,其他Cell都沒有設(shè)置標(biāo)題,你向下刷新的時(shí)候裙士,會(huì)發(fā)現(xiàn)總有一個(gè)Cell有標(biāo)題入客,但這個(gè)Cell不是第一個(gè)Cell,你頓時(shí)就懵逼了。所以Cell的重用時(shí)需要時(shí)刻注意初始化的問題桌硫。

六夭咬、系統(tǒng)自帶的UITableViewCell

系統(tǒng)自帶的UITableViewCell內(nèi)部控件示意圖

我們基本上很少使用系統(tǒng)自帶的UITableViewCell,樣式太過于死板了铆隘。


七卓舵、自定義Cell

基本步驟:
  1. 自定義類XXXTableViewCell,繼承UITableViewCell
  2. 重寫-(id)initWithStyle:reuseIdentifier:方法膀钠,添加子控件
  3. 最好重寫layoutSubView方法掏湾,設(shè)置子控件frame
  4. 然后在UITableView的代理方法tableView:cellForRowAtIndexPath:中使用重用機(jī)制創(chuàng)建該類XXXTableViewCell,再對(duì)cell進(jìn)行初始化

微博Cell子控件示意圖

八肿嘲、MVC模式

MVC模式示意圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末融击,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雳窟,更是在濱河造成了極大的恐慌尊浪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件封救,死亡現(xiàn)場(chǎng)離奇詭異拇涤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)誉结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門鹅士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搓彻,你說我怎么就攤上這事如绸。” “怎么了旭贬?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵怔接,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我稀轨,道長(zhǎng)扼脐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任奋刽,我火速辦了婚禮瓦侮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘佣谐。我一直安慰自己肚吏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布狭魂。 她就那樣靜靜地躺著罚攀,像睡著了一般党觅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斋泄,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天杯瞻,我揣著相機(jī)與錄音,去河邊找鬼炫掐。 笑死魁莉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的募胃。 我是一名探鬼主播旗唁,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摔认!你這毒婦竟也來了逆皮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤参袱,失蹤者是張志新(化名)和其女友劉穎电谣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抹蚀,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剿牺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了环壤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晒来。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖郑现,靈堂內(nèi)的尸體忽然破棺而出湃崩,到底是詐尸還是另有隱情,我是刑警寧澤接箫,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布攒读,位于F島的核電站,受9級(jí)特大地震影響辛友,放射性物質(zhì)發(fā)生泄漏薄扁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一废累、第九天 我趴在偏房一處隱蔽的房頂上張望邓梅。 院中可真熱鬧,春花似錦邑滨、人聲如沸日缨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殿遂。三九已至诈铛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墨礁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工耳峦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恩静,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓蹲坷,卻偏偏與公主長(zhǎng)得像驶乾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子循签,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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