下廚房的首頁(yè)通過(guò)UITableView實(shí)現(xiàn)展現(xiàn)信息.想實(shí)現(xiàn)首頁(yè),首先我們需要先去了解UITableView的結(jié)構(gòu).
1.UITableView的整體結(jié)構(gòu)

正是因?yàn)檫@個(gè)結(jié)構(gòu),當(dāng)你去做一款A(yù)PP的時(shí)候其實(shí)可以采用很多模式去解決問(wèn)題,用不同的headerView都可以解決問(wèn)題。當(dāng)你了解了大體的細(xì)節(jié)了之后我們要繼續(xù)深入研究另外一個(gè)結(jié)構(gòu)UITableViewCell雖然在實(shí)際的開(kāi)發(fā)中我們經(jīng)常會(huì)自定義Cell但是還是需要了解一下Cell的系統(tǒng)默認(rèn)結(jié)構(gòu)。

2.UITableViewDataSource
之所以有了DataSource應(yīng)該算是iOS語(yǔ)言開(kāi)發(fā)者也是按照MVC模式搞出來(lái)的,所以他們也在分離各個(gè)層次。
因?yàn)橹爸皇侵烙羞@么東西你一定要繼承,沒(méi)有研究這個(gè)協(xié)議主要做什么的。今天鼠標(biāo)一點(diǎn)擊,瞬間明朗了許多。
Apple文檔上面寫(xiě)的是:這是一個(gè)呈現(xiàn)數(shù)據(jù)模型對(duì)象,但是不提供關(guān)于外表信息包括Cells.也就是說(shuō)有多少rows,sections,能否移動(dòng).....等等這些不涉及到行為和呈現(xiàn)。
以下幾個(gè)方法是使用頻率比較高的一些方法,開(kāi)始我想在每個(gè)方法后面做好注釋?zhuān)前l(fā)現(xiàn)其實(shí)蘋(píng)果的方法名已經(jīng)解釋了這個(gè)方法的作用。
1/tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
2/tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
3/numberOfSectionsInTableView(tableView: UITableView) -> Int
3.UITableViewDelegate
TableView的代理主要負(fù)責(zé)Cell的行為和呈現(xiàn)。方法主要有設(shè)置高度,設(shè)置footerView和headerView,選中的處理,編輯的處理等等.
當(dāng)你使用了UITableView一定記得要設(shè)置數(shù)據(jù)源(DataSource)和代理(Delegate).如果你使用了UITableViewController這個(gè)就得另外說(shuō)了,你要繼承了UITableViewController 就不需要設(shè)置了,因?yàn)閁ITableViewController已經(jīng)幫你設(shè)置好了。
4.Cell的復(fù)用
貌似現(xiàn)在到處的面試題里面都會(huì)有這道題,已經(jīng)被問(wèn)爛的問(wèn)題了。原理很簡(jiǎn)單,蘋(píng)果會(huì)建立一個(gè)池塘用于存儲(chǔ)Cell模型的,接著通過(guò)你傳遞的各種條件計(jì)算出一頁(yè)能最多顯示多少個(gè)一樣的Cell,通過(guò)一個(gè)identifier確定是否是同一款的Cell,假如通過(guò)計(jì)算一頁(yè)顯示10個(gè)相同的Cell,只會(huì)生成10個(gè)模具放在池塘里面,接著當(dāng)一行Cell在屏幕消失了,而新的Cell出現(xiàn),這時(shí)候幕后做的工作就是:消失的Cell數(shù)據(jù)暫時(shí)清楚,模版留著給新出現(xiàn)的Cell使用,只要添上最新的數(shù)據(jù)就可以了。
整個(gè)過(guò)程就是這樣的,即使你有大量的cell也不至于對(duì)手機(jī)產(chǎn)生CPU產(chǎn)生大量的消耗。
5.Tips
開(kāi)發(fā)期間會(huì)遇到很多好玩的bug,也在網(wǎng)絡(luò)找到了很多前輩的溫馨提醒信息,現(xiàn)在整理如下
1.如何讓UITableView不顯示多余的分隔線?
self.tableView.tableFooterView = [[UIView alloc] init];(OC)
self.tableView.tableFooterView = UIView() (Swift)
2.在 tableView 的 style 為 Grouped 時(shí),設(shè)置:tableView:heightForHeaderInSection:
和 tableView:heightForFooterInSection:
返回值為 0 可能無(wú)效,需設(shè)置成 0.01。
3.不要實(shí)現(xiàn)沒(méi)有任何意思的delegate方法。
4.identifier一定要寫(xiě)成靜態(tài),因?yàn)闈L動(dòng),數(shù)據(jù)reload,初始化等等都會(huì)執(zhí)行cellForRowAtIndexPath。
5.其實(shí)我經(jīng)常使用reloadData()方法,其實(shí)還可以局部刷新。
6.雖然我不太使用Xib文件,今天在看下廚房的APP就發(fā)現(xiàn)他們有很多的XIB文件,只要注意不要過(guò)載
7.如果tableView出現(xiàn)重疊的話,請(qǐng)使用removeFromSuperview
如果還有更多的我會(huì)繼續(xù)補(bǔ)充。
其實(shí)今天沒(méi)寫(xiě)自定義Cell,但是我覺(jué)得當(dāng)你了解了一個(gè)控件之后,再去自定義應(yīng)該還好吧。我記得之前在網(wǎng)上看到一篇講述如何自定義控件的文章,我得好好研究好好的寫(xiě)一下整理一下。
確實(shí)寫(xiě)了一篇文章發(fā)現(xiàn)文筆需要改進(jìn),大腦的知識(shí)還是不夠多,希望能快速成長(zhǎng)和進(jìn)步。
按照計(jì)劃明天得搞定首頁(yè)的所有信息,也就是明天需要寫(xiě)ORM了,因?yàn)樯婕暗組odel層級(jí)的東西,也會(huì)涉及到一定的網(wǎng)絡(luò)知識(shí)和約束,所以可能會(huì)分兩篇來(lái)寫(xiě),約束還是改到周末吧,因?yàn)榇缫龇窒?/p>
我倒是建議大家能使用storyboard,所見(jiàn)即所得?,F(xiàn)在真的需要研究一下under the hood??偟戎鴦e人來(lái)喂你,差距會(huì)越來(lái)越大了。