When to use dequeueReusableCellWithIdentifier vs dequeueReusableCellWithIdentifier: forIndexPath

  The most important difference is that the forIndexPath: version asserts (crashes) if you didn't register a class or nib for the identifier. The older (non-forIndexPath:) version returns nil in that case.app

You register a class for an identifier by sending registerClass:forCellReuseIdentifier: to the table view. You register a nib for an identifier by sending registerNib:forCellReuseIdentifier:to the table view.ide

If you create your table view and your cell prototypes in a storyboard, the storyboard loader takes care of registering the cell prototypes that you defined in the storyboard.布局

Session 200 - What's New in Cocoa Touch from WWDC 2012 discusses the (then-new) forIndexPath: version starting around 8m30s. It says that “you will always get an initialized cell” (without mentioning that it will crash if you didn't register a class or nib).this

The video also says that “it will be the right size for that index path”. Presumably this means that it will set the cell's size before returning it, by looking at the table view's own width and calling your delegate's tableView:heightForRowAtIndexPath: method (if defined).  This is why it needs the index path..net

 

 
  • 博客分类: 
  • iOS

UITableView中有两种重用Cell的方法:prototype

Ios代码   收藏代码
  1. - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  
  2. - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);  

 

iOS 6中dequeueReusableCellWithIdentifier:被dequeueReusableCellWithIdentifier:forIndexPath:所取代。如此一来,在表格视图中建立并添加UITableViewCell对象会变得更为精简而流畅。并且使用dequeueReusableCellWithIdentifier:forIndexPath:必定会返回cell,系统在默认没有cell可复用的时候会自动建立一个新的cell出来。code

 

使用dequeueReusableCellWithIdentifier:forIndexPath:的话,必须和下面的两个配套方法配合起来使用:对象

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

 

一、若是是用NIB自定义了一个Cell,那么就调用registerNib:forCellReuseIdentifier:blog

二、若是是用代码自定义了一个Cell,那么就调用registerClass:forCellReuseIdentifier:get

 

以上这两个方法能够在建立UITableView的时候进行调用。

 

这样在tableView:cellForRowAtIndexPath:方法中就能够省掉下面这些代码:

Ios代码   收藏代码
  1. static NSString *CellIdentifier = @"Cell";  
  2. if (cell == nil)   
  3.     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];  

 

取而代之的是下面这句代码:

Ios代码   收藏代码
  1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];  

 

1、使用NIB

一、xib中指定cell的Class为自定义cell的类型(不是设置File's Owner的Class)

二、调用registerNib:forCellReuseIdentifier:向数据源注册cell

Ios代码   收藏代码
  1. [_tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:kCellIdentify];   

三、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:获取重用的cell,若是没有重用的cell,将自动使用提供的nib文件建立cell并返回(若是使用dequeueReusableCellWithIdentifier:须要判断返回的是否为空)

Ios代码   收藏代码
  1. CustomCell *cell = [_tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];  

四、获取cell时若是没有可重用cell,将建立新的cell并调用其中的awakeFromNib方法

 

2、不使用NIB

一、重写自定义cell的initWithStyle:withReuseableCellIdentifier:方法进行布局

二、注册cell

Ios代码   收藏代码
  1. [_tableView registerClass:[CustomCell class] forCellReuseIdentifier:kCellIdentify];   

三、在tableView:cellForRowAtIndexPath:中使用dequeueReusableCellWithIdentifier:forIndexPath:获取重用的cell,若是没有重用的cell,将自动使用提供的class类建立cell并返回

Ios代码   收藏代码
  1. CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];   
 
四、获取cell时若是没有可重用的cell,将调用cell中的initWithStyle:withReuseableCellIdentifier:方法建立新的cell

转自:

http://stackoverflow.com/questions/25826383/when-to-use-dequeuereusablecellwithidentifier-vs-dequeuereusablecellwithidentifi

http://eric-gao.iteye.com/blog/2234047

相关文章
相关标签/搜索