關於UITableViewCell的迴圈利用--面向初學者,uitableviewcell--

來源:互聯網
上載者:User

關於UITableViewCell的迴圈利用--面向初學者,uitableviewcell--

UITableViewCell的重複利用機制有效地節省記憶體開銷和提高程式效能。 

1 原理

tableView擁有一個緩衝池,存放未在使用(沒有顯示在介面)的cell。

tableView有一行cell要顯示時先從緩衝池裡找,沒有則建立,有一行cell隱藏不需要顯示時就放到緩衝池。

2 圖解迴圈利用代碼

//cellForRow 代碼

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

 

  static NSString *ID = @"test"; // cell迴圈利用標識為”test”

 

  //從當前tableView對應的緩衝池裡找標識為”test”的cell;

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

 

  //如果緩衝池裡沒有,即cell為空白,建立新的cell

  if(!cell){

   cell = [[UITableViewCell alloc]init];

  }

   return cell;

}

 

 

3 迴圈利用問題 3.1 問題1

這裡引入一個資料模型 LSUser(使用者模型),

屬性: name(NSString, 名字), vip(BOOL, 是否會員)

 

 

圖3-1

 

//cellForRow方法中設定資料

//設定使用者名稱稱

cell.textLabel.text = user.name;

 

//如果使用者是vip,設定使用者名稱稱顏色為紅色

if(user.vip){

    cell.textLabel.textColor = [UIColor redColor];

}

 

由於吳八不是會員,跳過if 語句,吳八名稱顏色應為黑色,但實際上卻保留著陳七cell0設定的會員顏色紅色。這是迴圈利用一個簡單的問題所在。

假設if 語句中添加了對稱的設定語句,這個問題就不會出現。

if(user.vip){

    cell.textLabel.textColor = [UIColor redColor];

}else{

    cell.textLabel.textColor = [UIColor blackColor];

}

 

UITableViewCell的迴圈利用要求我們對稱地設定視圖的外觀和狀態。

實際上這個案例的迴圈利用問題可以認為出在cell.textLabel.textColor預設顏色為黑色上,假設需求是非會員名稱顏色為藍色,於是設定資料時:

cell.textLabel.textColor = user.vip ? [UIColor redColor]: [UIColor blueColor];

認真思考下。。。

 

3.2 問題2

這裡有個需求:點擊了某一行cell, 當前cell使用者名稱稱顏色改為紫色, 其餘為原來的黑色

 

可能你會這麼做:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.textLabel.textColor = [UIColor purpleColor];

}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{

   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

 cell.textLabel.textColor = [UIColor blackColor];

}

暫時看來確實符合了需求,點擊的當前行名稱顏色為紫色,其餘為黑色

但是,當你拖動tableView, 當前行隱藏,隨意拖動,愕然地發現某一行名稱顏色為紫色,再回到原先點擊的當前行,名稱顏色卻為黑色而不是紫色。

 

這也是迴圈利用的問題。接下來解決這個問題。

當一行cell將要顯示時,會調用tableView的資料來源方法-tableView:cellForRowAtIndexPath;

迴圈利用影響影響cell顯示,不會影響未經處理資料,該方法中進行了資料設定的步驟,利用它介紹兩種解決方案:

 

1)  迴圈利用不會影響indexPath,indexPaht是唯一的。

 

  首先擁有一個NSIndexPath類型的selectedIndexPath屬性,用於紀錄當前選中行,在didSelectRowAtIndexPath方法中進行賦值。 

  然後在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中,

 

  //設定資料

  //取出對應行的資料模型

  LSUser *user = self.users[indexpath.row];

 

  //設定使用者名稱稱

  cell.textLabel.text = user.name;

 

  //根據是否是選中行設定名稱顏色

  if(self.selectedIndexPath == indexPath){
    cell.textLabel.textColor = [UIColor purpleColor];

  }else{

    cell.textLabel.textColor= [UIColor blackColor];

  }

 

2)  對資料動手,從資料模型中派生一個專對於該cell的資料模型,追加相應的屬性,然後在相應的地方對資料進行處理和設定。這裡不再贅述,該方案適合處理複雜的情況,比如如不一定是選中與非選擇兩種狀態,還可能是三種以上狀態,或者cell的動畫效果,或者需要[tableView reloadData]等的情況。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.