iOS學習筆記之UITableViewController&UITableView

iOS學習筆記之UITableViewController&UITableView

寫在前面

上個月末到如今一直都在忙實驗室的事情,與導師討論以後,發現目前在實驗室完成的工做還不足以寫成畢業論文,所以須要繼續思考新的算法。這是一件挺痛苦的事情,特別是在很難找到與本身研究方向相關的文獻的時候。也許網格序列水印這個課題自己的研究意義就是有待考證的。儘管如此,仍是要努力的思考下去。因爲實驗室的緣由,iOS的學習進度明顯受到影響,加之整理文檔自己是一件耗費時間和精力的事情,所以才這麼久沒有寫筆記了。web

MVC簡介

在介紹UITableView以前,簡單的介紹一下MVC(Model-View-Controller)模式,它是iOS開發所遵循的一種設計模式。其含義是,應用建立的任何一個對象,其類型一定是如下三種類型中的一種算法

  • 模型:負責存儲數據,與用戶界面無關設計模式

  • 視圖:負責顯示界面,與模型對象無關mvc

  • 控制器:負責確保視圖對象和模型對象的數據保持一致函數

UITableView簡介

UITableView是視圖,所以UITableView不負責處理應用的邏輯或數據,在實際使用UITableView時,要考慮下列問題:學習

  • 一般狀況下,要經過某個視圖控制對象來建立和釋放UITableView對象,並負責顯示或隱藏視圖ui

  • UITableView對象要有數據源才能正常工做。UITableView對象會向數據源查詢要顯示的函數、顯示錶格行所需的數據和其餘所需數據。凡是遵照UITableViewDataSource協議的OC對象,均可以稱爲UITableView對象的數據源。spa

  • 一般狀況下,要爲UITableView對象設置委託對象,以便能在該對象發生特定事件時作出相應的處理。凡是遵照UITableViewDelegate協議的對象,均可以稱爲UITableView對象的委託對象。設計

UITableViewController簡介

UITableViewController對象能夠扮演上述UITableView所須要的所有角色,包括視圖控制對象、數據源和委託對象。
UITableViewController是UIViewController的子類,所以有本身的view屬性。UITableViewController對象的view屬性指向一個UITableView對象,而且這個UITableView對象由UITableViewController對象負責設置和顯示。UITableVIewController對象會在建立UITableView對象後,爲這個UITableView對象的dataSource和delegate賦值,並指向本身,以下圖所示:
![enter description here][1]code

UITableView數據源

UITableView對象會本身查詢另外一個對象以得到要顯示的內容,這個對象就是UITableVIew對象的數據源,也就是dataSource屬性所指向的對象。
當某個UITableView對象要獲取顯示的數據時,會向其數據源發送一組特定的消息,這些消息都是在UITableViewDataSource協議中聲明的。tableView:numberOfRowsInSecton:tableView:cellForRowAtIndexPath:是協議中必須實現的兩個方法。UITableView對象能夠經過數據源對象的這兩個方法得到應該顯示的行數及顯示各行所需的視圖。

  • tableView:numberOfRowsInSection:
    方法原型

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSIngeger)section

該方法是UITableViewDataSource中的必須方法,該方法會返回一個整型值(NSInteger),表明UITableView對象顯示的函數。
UITableView對象能夠分段顯示數據,每一個表格段(section)包含一組獨立的行。傳入tableView:numberOfRowsInSecton:方法中的section就是用於指定某個表格段。
- tableView:cellForRowAtIndexPath:
方法原型:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

在介紹該方法前,須要先介紹另外一個類:UITableViewCell

UITableViewCell簡介

表視圖顯示的每一行都是一個獨立的視圖,這些視圖是UITableViewCell對象。UITableViewCell對象有一個子視圖:contentView。contentView也包含不少子視圖,它的子視圖構成UITableViewCell對象的主要外觀。負責顯示UITableViewCell對象所表明的數據,是contentView所包含的三個子視圖。其中兩個視圖是UILabel對象,分別爲textLable屬性和detailTextLabel屬性所指向的對象。第三個是UIImageView對象,即imageView屬性所指向的對象。
在建立UITableViewCell對象時,須要設置一種風格(UITableViewCellStyle),風格決定UITableViewCell對象會顯示上述子視圖中的哪幾個,以及這些視圖在contentView中的位置。下圖列出了全部的風格常量和外觀示例。
![enter description here][2]

下面假定咱們在表格中要顯示一些列的A對象。咱們須要經過UITableViewCell對象的textLabel屬性顯示某個對象A的描述信息。這時須要實現UITableViewDataSource協議的第二個必須方法——tableView:cellForRowAtIndexPath:
tableView:cellForRowAtIndexPath:須要完成的任務以下:建立一個UITableViewCell對象,獲取UITableViewCell對象所表明的A對象,向A對象發送description消息,將獲得的描述信息賦給UITableViewCell對象的textLabel屬性,最後返回UITableViewCell對象。
傳入tableView:cellForRowAtIndexPath:的第二個參數是一個NSIndexPath對象,該對象包含兩個屬性section(段)和row(行)。當UITableView對象向其數據源發送tableView:cellForRowAtIndexPath:消息時,其目的是獲取用於顯示第section個表格段、第row行數據的UITableViewCell對象。

重用UITableViewCell對象

iOS設備內存有限,所以若某個UITableView對象要顯示大量的記錄,而且要針對每條記錄建立相應的UITableViewCell對象,就會很快耗盡iOS設備的內存。
爲了解決該問題,須要重用UITabelViewCell對象。當用戶滾動UITbelView對象時,部分UITableViewCell對象會移出窗口。UITableView對象會將移出窗口的UITableViewCell對象放入UITableViewCell對象池,等待重用。當UITableView對象要求數據源返回某個UITableVIewCell對象時,數據源能夠先查看對象池。若是有未使用的UITabelViewCell對象,就能夠用新的數據配置這個UITableViewCell對象,而後將其返回給UITableView對象,從而避免建立新對象。

總結

在使用UITableView時,要牢記UITableView是視圖,只負責顯示,而不進行數據和邏輯處理。若是要讓UITableView分多個表格段顯示,或進行其餘複雜的顯示,應該將判斷邏輯放在「模型」部分,而後經過「控制器」將判斷後的結果傳入到UITableView中。
[1]: ./images/1464090777571.jpg "1464090777571.jpg"
[2]: ./images/1464093634179.jpg "1464093634179.jpg"

相關文章
相關標籤/搜索