ios開發(fā)-UITableView基礎

UITableView基礎

  • 設置UITableView的dataSource,delegate

  • UITableView多組數(shù)據(jù)和單組數(shù)據(jù)的展示

  • UITableViewCell的常見的屬性

  • UITableView的性能優(yōu)化(cell的循環(huán)利用)

  • 自定義Cell

什么是UITableView?

  • 在移動應用中我們看到的各種列表數(shù)據(jù)
  • 在iOS中要實現(xiàn)展示列表數(shù)據(jù),最常用的做法就是使用UITableView
  • 重要的是UITableView集成UIScrollview,因此是支持垂直滾動的,性能極佳

UITableView的兩種樣式

  • 靜態(tài)列表和動態(tài)列表(一個是寫死的,一個是根據(jù)傳入的數(shù)據(jù)來顯示)

如何展示數(shù)據(jù)

  • UITableView需要一個數(shù)據(jù)源(dataSource)來顯示數(shù)據(jù)
  • UITableView會向數(shù)據(jù)源查詢一共有多少行數(shù)據(jù)以及每一行顯示什么數(shù)據(jù)等
  • 沒有設置數(shù)據(jù)源的UITableView只是一個空格—類似我們看到的紙質(zhì)的算術(shù)本.
  • 凡是遵守UITableViewDataSource協(xié)議的OC對象,都可以是UITableView的數(shù)據(jù)源

tableView和數(shù)據(jù)源

以下是遵守協(xié)商實現(xiàn)的方法:

調(diào)用數(shù)據(jù)源的下面的方法得知一共有多少組數(shù)據(jù)
    - (NSInteger)numberOfSectionInTableView:(UITableView *)tableView;

調(diào)用數(shù)據(jù)源的方法得知每一組有多少行
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
同樣是調(diào)用數(shù)據(jù)源的方法每一行顯示的內(nèi)容
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

認識MVC

  • MVC是一組合的設計思想,貫穿的是整個ios開發(fā)中的
  • MVC中的三個角色
    • M:Model,模型數(shù)據(jù)
    • V:View,視圖(界面)
    • C:Control,控制中心
  • MVC的幾個明顯的特征和體現(xiàn):
    • View上面顯示什么東西,取決于Model
    • 只要Model數(shù)據(jù)改變了,View上面顯示的狀態(tài)會跟著更改
    • Control負責初始化Model,并且將Model傳遞給View去解析展示

Cell簡介

  • UITableView的每一行都是一個UITableViewCell,通過dataSource的tableView:cellForRowAtIndexPath:方法來初始化每一行
  • UITableViewCell內(nèi)部有個默認的子視圖:contentView,contentView是UITableViewViewCell所顯示內(nèi)容的父控件視圖,可顯示一些輔助指示視圖
  • 輔助指示視圖的作用是顯示一個表示動作的圖標,可以通過設置UITableViewCell的accessoryType來顯示,默認是UITableViewCellAccessoryNone(不顯示輔助指示視圖),其他值如下:
  • UITableViewCellAccessoryDisclosureIndicator
  • UITableViewCellAccessoryDetailButton
  • UITableViewCellAccessoryCheckmark
  • 還可以通過cell的accessoryView來設置自定義輔助指示視圖(比如在右邊放一個開關(guān))

UITableViewCell的contentView

  • contentView下默認有3個子視圖
    • 其中兩個是UILabel(通過UITableViewCell的textLabel和detailTextLabel屬性訪問)
    • 第3個時UIImageView(通過UITableViewCell的imageView屬性訪問)
    • UITableViewCell還有一個UITableViewCellStyle屬性,用于決定使用contentView的哪些子視圖,以及這些子視圖在contentView中的位置

Cell的重用原理

  • ios設備的內(nèi)存是有限的,如果用UITableView去顯示所有的數(shù)據(jù),沒那么內(nèi)存會爆炸,此時就要用到cell的重用——簡單的說就是幾個cell的輪流使用,好比一個叫cell的盒子,裝不同的數(shù)據(jù)出來顯示,盒子就那幾個,數(shù)據(jù)不同而已

  • 重用的原理:當滾動列表的時候,部分的UITableViewCell會被滾出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用.當UITableView要求dataSource返回UITableViewCell,dataSource會先查看這個對象池,如果池中有未使用的UITableView,重新顯示代窗口中,從而避免創(chuàng)建新對象.

  • 要注意的是!!!有時候自定義的UITableViewCell(用一個子類集成UITableViewCell),而且每一行用的不一定是同一種UITableViewCell,所以一個UITableView可能擁有不同類型的UITableViewCell,這樣可能會再對象池子中造成混亂

  • 解決方案:UITableViewCell有個NSString *reuseIdentifier屬性,可以再初始化UITableViewCell的時候傳入一個特定的字符串表示來設置reuseIdentifier(一般用UITableViewCell的類名).當UITableView要求dataSource返回UITableViewCell時,先通過一個字符串表示來對象池子中查找對應的UITableViewCell對象,如果有就取出來,沒有就傳入這個字符串標識來初始化一個UITableViewCell對象

cell重用的實現(xiàn)代碼如下:

- (UITableViewCell *)tableview:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //1.定義一個cell標識
    static NSString *ID = @“cell”;

    //2.從緩存池子中取出cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    //3.度過緩存池中沒有cell
    if (cell == nil){

    cell =[ [UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]
}

    //4.設置cell屬性
    cell.textLabel.text = ……….
    return cell;
}

通過代碼自定義Cell(cell的高度不一致)

  • 先建一個繼承UITableViewCell的類
  • 重寫initWithStyle:reuseIdentifier:方法
    • 添加所有需要顯示的子控件(不需要設置子控件的數(shù)據(jù)和frame,子控件要添加到contentView中)
    • 進行子控件一次性的屬性設置(有些屬性只要設置一次,比如字體\固定的圖片)
  • 提供兩個模型
    • 數(shù)據(jù)模型:存放文字和圖片數(shù)據(jù)的
    • frame模型:存放數(shù)據(jù)模型\所有的子控件的frame\cell的高度
  • cell用有一個frame模型(不要直接擁有數(shù)據(jù)模型)
  • 重寫frame模型屬性的setter方法:在這個方法中設置子控件的顯示數(shù)據(jù)和frame
  • frame模型數(shù)據(jù)的初始化已經(jīng)采取了懶加載的方式(每一個cell對應的frame模型數(shù)據(jù)只加載一次)

給UITableView加一個側(cè)邊的索引條(如下圖)

Snip20151216_3.png

有一個小技巧就是把它的頭部標題Header,最好是取一個字母,例如是ABC.....
這樣的話是方便索引條來排序的
實現(xiàn)的代碼如下:

- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
  // 取出self.carGroups這個數(shù)組每一個對象(XMGCarGroup)的title屬性的值,放在一個新的數(shù)組中返回
return [self.carGroups valueForKeyPath:@"title"];
}

(這里的titl就是我們設置的header的一個key)
在viewDidLoad中,設置索引條的背景顏色和文字顏色
self.tableView.sectionIndexColor = [UIColor redColor];
self.tableView.sectionIndexBackgroundColor = [UIColor cyanColor];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跨扮,隨后出現(xiàn)的幾起案子帝璧,更是在濱河造成了極大的恐慌浅妆,老刑警劉巖杜耙,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序臂,死亡現(xiàn)場離奇詭異启摄,居然都是意外死亡稿壁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門歉备,熙熙樓的掌柜王于貴愁眉苦臉地迎上來常摧,“玉大人,你說我怎么就攤上這事威创。” “怎么了谎懦?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵肚豺,是天一觀的道長。 經(jīng)常有香客問我界拦,道長吸申,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任享甸,我火速辦了婚禮截碴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛉威。我一直安慰自己日丹,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布蚯嫌。 她就那樣靜靜地躺著哲虾,像睡著了一般丙躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上束凑,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天晒旅,我揣著相機與錄音,去河邊找鬼汪诉。 笑死废恋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扒寄。 我是一名探鬼主播鱼鼓,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旗们!你這毒婦竟也來了蚓哩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤上渴,失蹤者是張志新(化名)和其女友劉穎岸梨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稠氮,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡曹阔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隔披。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃份。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奢米,靈堂內(nèi)的尸體忽然破棺而出抓韩,到底是詐尸還是另有隱情,我是刑警寧澤鬓长,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布谒拴,位于F島的核電站,受9級特大地震影響涉波,放射性物質(zhì)發(fā)生泄漏英上。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一啤覆、第九天 我趴在偏房一處隱蔽的房頂上張望苍日。 院中可真熱鬧,春花似錦窗声、人聲如沸相恃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆茫。三九已至侨歉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揩魂,已是汗流浹背幽邓。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留火脉,地道東北人牵舵。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像倦挂,于是被迫代替她去往敵國和親畸颅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

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