iOS - UITableView中有兩種重用Cell的方法

UITableView中有兩種重用Cell的方法:ide

iOS代碼 
- (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:的話,必須和下面的兩個配套方法配合起來使用:spa

iOS代碼 
// 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);  

一、若是是用NIB自定義了一個Cell,那麼就調用registerNib:forCellReuseIdentifier:code

二、若是是用代碼自定義了一個Cell,那麼就調用registerClass:forCellReuseIdentifier:對象

 

以上這兩個方法能夠在建立UITableView的時候進行調用。blog

 

這樣在tableView:cellForRowAtIndexPath:方法中就能夠省掉下面這些代碼:string

iOS代碼 
static NSString *CellIdentifier = @"Cell";  

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];  it

if (cell == nil)  {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  
}

 

 

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

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

  

1、使用NIBclass

一、xib中指定cell的Class爲自定義cell的類型(不是設置File's Owner的Class)

二、調用registerNib:forCellReuseIdentifier:向數據源註冊cell

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

 

三、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:獲取重用的cell,若是沒有重用的cell,將自動使用提供的nib文件建立cell並返回若是使用dequeueReusableCellWithIdentifier:須要判斷返回的是否爲空

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

 

四、獲取cell時若是沒有可重用cell,將建立新的cell並調用其中的awakeFromNib方法

 

2、不使用NIB

一、重寫自定義cell的initWithStyle:withReuseableCellIdentifier:方法進行佈局

二、註冊cell

iOS代碼
[_tableView registerClass:[CustomCell class] forCellReuseIdentifier:kCellIdentify];   

 

三、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:獲取重用的cell,若是沒有重用的cell,將自動使用提供的class類建立cell並返回

iOS代碼 
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];   

 

四、獲取cell時若是沒有可重用的cell,將調用cell中的initWithStyle:withReuseableCellIdentifier:方法建立新的cell

相關文章
相關標籤/搜索