標籤:
在眾多移動應?用中,能看到各式各樣的表格式資料 ,
• 在iOS中,要實現表格式資料展?示,最常?用的做法就是使?用UITableView
• UITableView繼承?自UIScrollView,因此?支援垂直滾動,?而且效能極佳
UITableView的兩種樣式,一種是只有一組別,還有一種是有多個數別如:
如何展?示資料 ?
UITableView需要?一個資料來源(dataSource)來顯?示資料,
UITableView會向資料來源查詢?一共有多少?行資料以及每?一?行顯?示什麼資料等
凡是遵守UITableViewDataSource協議的OC對象,都可以是UITableView的資料來源
tableView展?示資料的過程
1. 調?用資料來源的下?面?方法得知?一共有多少組資料
- (NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView;
2. 調?用資料來源的下?面?方法得知每?一組有多少?行資料
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
3. 調?用資料來源的下?面?方法得知每?一?行顯?示什麼內容
- (UITableViewCell *)tableView:(UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;
當然,我們還要實現協議,不然,這些代理方法也無法使用。property (nonatomic, assign) id <UITableViewDataSource> dataSource; UITableView
通過這3個代理方法,就可以把想要顯示在頁面的資料,綁定到UITableView上。
二 Cell簡介
UITableView的每?一?行都是?一個UITableViewCell,通過dataSource的 tableView:cellForRowAtIndexPath:方法來初始化一?行
UITableViewCell內部有個預設的?子視圖:contentView,contentView是UITableViewCell所 顯?示內容的?父視圖,可顯?示?一些輔助指?示視圖•
輔助指?示視圖的作?用是顯?示?一個表?示動作的表徵圖,可以通過設定UITableViewCell的 accessoryType來顯?示,
預設是UITableViewCellAccessoryNone(不顯?示輔助指?示視圖), 其他值如下:
● UITableViewCellAccessoryDisclosureIndicator
● UITableViewCellAccessoryDetailDisclosureButton
● UITableViewCellAccessoryCheckmark
• 還可以通過cell的accessoryView屬性來?自訂輔助指?示視圖
UITableViewCell的contentView
• contentView下預設有3個?子視圖
其中2個是UILabel(通過UITableViewCell的textLabel和detailTextLabel屬性訪問)
第3個是UIImageView(通過UITableViewCell的imageView屬性訪問)
UITableViewCell還有?一個UITableViewCellStyle屬性,?用於決定使?用contentView的 哪些?子視圖,以及這些?子視圖在contentView中的位置
Cell的重?用原理
• iOS裝置的記憶體有限,如果?用UITableView顯?示成千上萬條資料,就需要成千上萬 個UITableViewCell對象的話,那將會耗盡iOS裝置的記憶體。
要解決該問題,需要重 ?用UITableViewCell對象
• 重?用原理:當滾動列表時,部分UITableViewCell會移出窗??口,UITableView會將窗??口外 的UITableViewCell放?入?一個對象池中,等待重?用。
當UITableView要求dataSource返回 UITableViewCell時,dataSource會先查看這個對象池,
如果池中有未使?用的 UITableViewCell,dataSource會?用新的資料配置這個UITableViewCell,
然後返回給 UITableView,重新顯?示到窗??口中,從?而避免建立新對象
• 還有?一個?非常重要的問題:有時候需要?自訂UITableViewCell(?用?一個?子類繼 承UITableViewCell),
?而且每?一?行?用的不?一定是同?一種UITableViewCell,所以?一 個UITableView可能擁有不同類型的UITableViewCell,
對象池中也會有很多不同類型的 UITableViewCell,那麼UITableView在重?用UITableViewCell時可能會得到錯誤類型的 UITableViewCell
• 解決?方案:UITableViewCell有個NSString *reuseIdentifier屬性,可以在初始
化UITableViewCell的時候傳?入?一個特定的字串標識來設定reuseIdentifier(?一般 ?用UITableViewCell的類名)。
當UITableView要求dataSource返回UITableViewCell時,先 通過?一個字串標識到對象池中尋找對應類型的UITableViewCell對象,
如果有,就重 ?用,如果沒有,就傳?入這個字串標識來初始化?一個UITableViewCell對象
Cell的重?用代碼- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{?// 1.定義?一個cell的標識static NSString *ID = @"mjcell";// 2.從緩衝池中取出cellUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];// 3.如果緩衝池中沒有cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:ID];}// 4.設定cell的屬性... return cell;}
IOS UitableView 介紹