UITableView的簡(jiǎn)單理解

1.創(chuàng)建UITableView

_exampleTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];
創(chuàng)建UITableView對(duì)象,并設(shè)置代理和數(shù)數(shù)據(jù)源
_exampleTableView.delegate = self;
_exampleTableView.dataSource = self;

2.兩種樣式style

在創(chuàng)建UITableView的時(shí)候有兩種樣式,UITableViewStylePlain和UITableViewStyleGrouped
其中UITableViewStylePlain是默認(rèn)的樣式
區(qū)別:
1.有分區(qū)的時(shí)候
UITableViewStylePlain 區(qū)頭和區(qū)尾是懸浮的
UITableViewStyleGrouped 當(dāng)沒(méi)有設(shè)置分區(qū)頭時(shí)狐赡,會(huì)有默認(rèn)的分區(qū)頭的效果模她,區(qū)頭和區(qū)尾是隨cell一起滑動(dòng)的

2.無(wú)分區(qū)的時(shí)候
UITableViewStylePlain 單元格會(huì)鋪滿整個(gè)UITableView

<!--去除線-->
_exampleTableView.separatorStyle = UITableViewCellSeparatorStyleNone;

3.注冊(cè)單元格

[_exampleTableView registerClass:[firstTableViewCell class] forCellReuseIdentifier:cellFirstID];

4.實(shí)現(xiàn)代理和數(shù)據(jù)源中協(xié)議的方法

#pragma mark - UITableViewDelegate

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    exampleModel *model = _arrayExample[indexPath.row];
    return model.cellHeight;
}

#pragma mark - UITableViewDataSource

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _arrayExample.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    firstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellFirstID];
    exampleModel *model = _arrayExample[indexPath.row];
    [cell updateCellData:model];
    return cell;
}

3.代理方法(執(zhí)行順序)

numberOfSectionsInTableView(分區(qū)個(gè)數(shù))
numberOfRowsInSection(每個(gè)分區(qū)有多少行)
heightForRowAtIndexPath(單元格高度)
cellForRowAtIndexPath(自定義單元格,當(dāng)cell要顯示的時(shí)候就會(huì)調(diào)用此方法)
先執(zhí)行numberOfSectionsInTableView是因?yàn)閁ITableView繼承于UIScrollview的
需要先設(shè)置UIScrollview的contentSize這個(gè)屬性,UITableView才可以顯示和滾動(dòng)起來(lái)
然后調(diào)用cellForRowAtIndexPath將返回的視圖添加到UIScrollview上.

4.UITableView的繪制

layoutSubviews
該方法是對(duì)子視圖的布局,在第一次設(shè)置數(shù)據(jù)源的時(shí)候調(diào)用
UITableView是繼承自UIScrollview,當(dāng)當(dāng)前視圖的 size 變化時(shí)才會(huì)觸發(fā)此方法(UITableView滑動(dòng)的時(shí)候是因?yàn)楦淖兞薱ell的高度所以才會(huì)導(dǎo)致layoutSubviews觸發(fā))
在布局前,要確定數(shù)據(jù)模型中已經(jīng)緩存了所有高度.

reloadData
數(shù)據(jù)發(fā)生變化,需要重新刷新cell顯示的內(nèi)容狈网,同時(shí)將所有顯示的UITableViewCell和未顯示可復(fù)用的UITableViewCell全部從父視圖移除然后重新創(chuàng)建
需要重新計(jì)算相關(guān)的高度值,并緩存起來(lái)

5.UITableViewCell復(fù)用機(jī)制

第一種方式:

(1)定義一個(gè)全局的變量

static NSString *cellFirstID = @"cellFirst";

(2)注冊(cè)cell

[_exampleTableView registerClass:[firstTableViewCell class] forCellReuseIdentifier:cellFirstID];

(3)在UITableViewDataSource的代理方法中獲取或創(chuàng)建cell

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//去緩存池中查找是否有這個(gè)標(biāo)識(shí)的cell  如果有那就取出來(lái)(取出來(lái)的前提是注冊(cè)了cell)
//如果沒(méi)有那就根據(jù)這個(gè)標(biāo)識(shí)去創(chuàng)建對(duì)應(yīng)的cell
firstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellFirstID];
exampleModel *model = _arrayExample[indexPath.row];
[cell updateCellData:model];
return cell;
}

第二種方式:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//    當(dāng)static關(guān)鍵字修飾局部變量時(shí),只會(huì)初始化一次,并且在程序中只有一份內(nèi)存
static NSString *cellFirstID = @"cell";
//去緩存池中查找是否有這個(gè)標(biāo)識(shí)的cell(根據(jù)標(biāo)識(shí)去取cell)  如果有就取出來(lái)
firstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellFirstID];
//    如果緩存池中沒(méi)有,則根據(jù)這個(gè)標(biāo)識(shí)去創(chuàng)建一個(gè)cell
if (cell==nil) {
    cell = [[firstTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellFirstID];
}
exampleModel *model = _arrayExample[indexPath.row];
[cell updateCellData:model];
return cell;
}

總結(jié):

(1)iOS設(shè)備的內(nèi)存有限,不是每條數(shù)據(jù)都重新創(chuàng)建一個(gè)UITableViewCell,比如手機(jī)屏幕只能顯示7行單元格,那么就會(huì)創(chuàng)建含有Identifier標(biāo)識(shí)符的7個(gè)cell,這時(shí)候緩存池中是空的.
(2)當(dāng)向上滑動(dòng)的時(shí)候,上面的含有標(biāo)識(shí)符的cell已經(jīng)存放到緩存池中,當(dāng)顯示第8個(gè)單元格時(shí),就會(huì)去訪問(wèn)緩存池,查看是否有這個(gè)Identifier,如果有直接從緩存池中獲取.沒(méi)有的話則會(huì)根據(jù)這個(gè)標(biāo)識(shí)去創(chuàng)建一個(gè)cell.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棍辕,隨后出現(xiàn)的幾起案子吹零,更是在濱河造成了極大的恐慌,老刑警劉巖求摇,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殊者,居然都是意外死亡与境,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)猖吴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摔刁,“玉大人,你說(shuō)我怎么就攤上這事海蔽」睬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵准潭,是天一觀的道長(zhǎng)趁俊。 經(jīng)常有香客問(wèn)我域仇,道長(zhǎng)刑然,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任暇务,我火速辦了婚禮泼掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垦细。我一直安慰自己择镇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布括改。 她就那樣靜靜地躺著腻豌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘱能。 梳的紋絲不亂的頭發(fā)上吝梅,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音惹骂,去河邊找鬼苏携。 笑死,一個(gè)胖子當(dāng)著我的面吹牛对粪,可吹牛的內(nèi)容都是我干的右冻。 我是一名探鬼主播装蓬,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纱扭!你這毒婦竟也來(lái)了牍帚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跪但,失蹤者是張志新(化名)和其女友劉穎履羞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屡久,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忆首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了被环。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糙及。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筛欢,靈堂內(nèi)的尸體忽然破棺而出浸锨,到底是詐尸還是另有隱情,我是刑警寧澤版姑,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布柱搜,位于F島的核電站,受9級(jí)特大地震影響剥险,放射性物質(zhì)發(fā)生泄漏聪蘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一表制、第九天 我趴在偏房一處隱蔽的房頂上張望健爬。 院中可真熱鬧,春花似錦么介、人聲如沸娜遵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)设拟。三九已至,卻和暖如春久脯,著一層夾襖步出監(jiān)牢的瞬間纳胧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工桶现, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲雅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓骡和,卻偏偏與公主長(zhǎng)得像相赁,于是被迫代替她去往敵國(guó)和親相寇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348