UITableView中兩種 Cell 重用的方法

轉自:jsntghf

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);  

在iOS 6中dequeueReusableCellWithIdentifier:dequeueReusableCellWithIdentifier:forIndexPath:所取代。如此一來,在表格視圖中創建并添加UITableViewCell對象會變得更為精簡而流暢。而且使用dequeueReusableCellWithIdentifier:forIndexPath:一定會返回cell,系統在默認沒有cell可復用的時候會自動創建一個新的cell出來。

使用dequeueReusableCellWithIdentifier:forIndexPath:的話,必須和下面的兩個配套方法配合起來使用:

// Beginning in iOS 6, clients can register a nib or class for each cell.  
// If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.  
// Instances returned from the new dequeue method will also be properly sized when they are returned.  
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);  
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);  

注冊 Cell:#

1、如果是用NIB自定義了一個Cell,那么就調用registerNib:forCellReuseIdentifier:
2、如果是用代碼自定義了一個Cell,那么就調用registerClass:forCellReuseIdentifier:

以上這兩個方法可以在創建UITableView的時候進行調用。

這樣在tableView:cellForRowAtIndexPath:方法中就可以省掉下面這些代碼:

static NSString *CellIdentifier = @"Cell";  
if (cell == nil)   
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  

取而代之的是下面這句代碼:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];  

一、使用NIB

1、xib中指定cell的Class為自定義cell的類型(不是設置File's Owner的Class)
2、調用registerNib:forCellReuseIdentifier:向數據源注冊cell

[_tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:kCellIdentify];   

3、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:獲取重用的cell,如果沒有重用的cell,將自動使用提供的nib文件創建cell并返回(如果使用dequeueReusableCellWithIdentifier:需要判斷返回的是否為空)

CustomCell *cell = [_tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];  

4、獲取cell時如果沒有可重用cell,將創建新的cell并調用其中的awakeFromNib方法

二、不使用NIB

1、重寫自定義cell的initWithStyle:withReuseableCellIdentifier:方法進行布局
2、注冊cell

[_tableView registerClass:[CustomCell class] forCellReuseIdentifier:kCellIdentify];   ```
3、在`tableView:cellForRowAtIndexPath:`中使用`dequeueReusableCellWithIdentifier:forIndexPath:`獲取重用的cell,如果沒有重用的cell,將自動使用提供的class類創建cell并返回

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath]; ```
4、獲取cell時如果沒有可重用的cell,將調用cell中的initWithStyle:withReuseableCellIdentifier:方法創建新的cell

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容