ios開發 UITableCell 可重用問題

來源:互聯網
上載者:User

 解釋一:

1.

static NSString *CellTableIdentifier = @"CellTableIdentifier ";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                             CellTableIdentifier];
    if (!celll) {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:CellTableIdentifier] autorelease];
}
    首先,先說一下重用是如何?的,我們有一個很長的tableview,假設是100行,但在我們設計的行高情況下,螢幕只能顯示10行,所以,當載入view的時候,實際只建立這10個cell,當我們用手指向上滑動即下方的第11個cell向上滑進介面的過程中,我們發現第一行的cell會滑出介面,當滑出後,第一行這個cell會被放到重用隊列中,第11行將獲得重用隊列中的一個cell,這樣,可以很好的控制記憶體。

2.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellTableIdentifier];   意思是定義一個cell,在tableview中的可重用隊列中尋找有CellTableIdentifier標識的UITableViewCell,以進行重用。這個Identifier可以由我們自由定義成一些字串。當然,如果在隊列中有這樣的UITableViewCell,那麼則返回它給cell,若沒有,則返回nil給cell。因為我們在寫程式時經常需要用到好幾個表格,每個表格中的cell布局都不一樣,所以我們需要將在同一個表格的cell(布局一樣)進行標記Identifier,這樣,在重用的時候可以得到匹配的cell。

3.

   if (!celll) {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault
                 reuseIdentifier:CellTableIdentifier] autorelease];
}

if語句,若返回的是nil,即cell==nil,則我們需要分配空間並初始化一個cell,而且需要關聯reuseIdentifier,以便後面重用的時候能夠根據Identifier找到這個cell,若cell不為nil,則重用成功,並可return此cell。

 解釋二:

每一個UITableView裡都維護著一個cell隊列,當UITableView剛載入的時候,cell隊列裡是沒有任何資料的。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",也就是根據一個標識identifier從cell隊列裡取出一個UITableViewCell,當然了,如果cell隊列裡沒有此標識的cell,調用此方法的結果就是返回nil。因此,在UITableView剛載入的時候,cell隊列裡沒有可用的cell,所以必須通過語句

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

來建立對應CellIdentifier標識的UITableViewCell執行個體。

而當UITableView在滾動的時候導致UITableViewCell滾出手機螢幕視圖的時候,程式會將這一個UITalbeViewCell執行個體放入此UITableView所維護的cell隊列中。當UITableview中有新的UITableViewCell需要展現在手機螢幕視圖上時,就會調用tableView:cellForRowAtIndexPath:方法了,因此我們可以知道以下幾點:

1-重取出來的cell是有可能已經捆綁過資料或者加過子視圖的,所以,如果有必要,要清除資料(比如textlabel的text)和remove掉add過的子視圖(使用tag)。

2-這樣設計的目的是為了避免頻繁的 alloc和delloc cell對象而已,沒有多複雜。

3-設計的關鍵是實現cell和資料的完全分離

如果不想重用UITableViewCell執行個體,如在一個每一行都顯示不同內容的UITableView執行個體時,我們可以用如下的方法:

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];

來重新定義標識。

這樣每一行都有其對應的identifier,從cell隊列裡取出來只有兩個結果:

1-cell隊列裡沒有此identifier對應的UITableViewCell執行個體,返回nil

2-cell隊列裡有此identifier對應的UITableViewCell執行個體,而且不會有重用到其他不同行的cell的情況

解釋三:

每一個UITableView裡都維護著一個cell隊列,當UITableView剛載入的時候,cell隊列裡是沒有任何資料的。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",也就是根據一個標識identifier從cell隊列裡取出一個UITableViewCell,當然了,如果cell隊列裡沒有此標識的cell,調用此方法的結果就是返回nil。因此,在UITableView剛載入的時候,cell隊列裡沒有可用的cell,所以必須通過語句

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

來建立對應CellIdentifier標識的UITableViewCell執行個體。

而當UITableView在滾動的時候導致UITableViewCell滾出手機螢幕視圖的時候,程式會將這一個UITalbeViewCell執行個體放入此UITableView所維護的cell隊列中。當UITableview中有新的UITableViewCell需要展現在手機螢幕視圖上時,就會調用tableView:cellForRowAtIndexPath:方法了,因此我們可以知道以下幾點:

1-重取出來的cell是有可能已經捆綁過資料或者加過子視圖的,所以,如果有必要,要清除資料(比如textlabel的text)和remove掉add過的子視圖(使用tag)。

2-這樣設計的目的是為了避免頻繁的 alloc和delloc cell對象而已,沒有多複雜。

3-設計的關鍵是實現cell和資料的完全分離

如果不想重用UITableViewCell執行個體,如在一個每一行都顯示不同內容的UITableView執行個體時,我們可以用如下的方法:

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];

來重新定義標識。

這樣每一行都有其對應的identifier,從cell隊列裡取出來只有兩個結果:

1-cell隊列裡沒有此identifier對應的UITableViewCell執行個體,返回nil

2-cell隊列裡有此identifier對應的UITableViewCell執行個體,而且不會有重用到其他不同行的cell的情況

 

解釋四:

解決uitableviewcell重繪出現重疊的現象

當我們的uitableview為透明或者判斷cell是否為空白時,會發現uitableveiwcell會出現重疊,下面為自己的解決辦法,提供給各位參考

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

    UITableViewCell *cell=nil;

    static NSString *reuse=@"cell";

    if (cell==nil) {

        cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuse] autorelease];

    }else{

        while ([cell.contentView.subviews lastObject] != nil) {  

            [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];  //刪除並進行重新分配

        }  

    }

    

    cell.textLabel.text=@"cell";

    

    return cell;

}

 

解釋五:

解決UIlable在tablecell上更新重疊的問題

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellName] autorelease];

    }

    for (UIView * view in cell.contentView.subviews) {

        [view removeFromSuperview];

    }

 [cell.contentView addSubview:label];

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.