使用iOS 6时设置UITableViewCell样式UITableView dequeueReusableCellWithIdentifier:forIndexPath:

我想解决如何设置UITableViewCellStyleUITableViewCellStyle使用iOS 6中的新方法。

以前,在创buildUITableViewCell我会在调用initWithStyle:时更改UITableViewCellStyle枚举来创build不同types的默认单元格initWithStyle:但从我所能收集的情况来看,情况已不再是这样。

UITableView的Apple文档指出:

返回值 :具有相关重用标识符的UITableViewCell对象。 此方法始终返回一个有效的单元格。

讨论 :出于性能原因,表视图的数据源通常应该在将单元格分配给其tableView:cellForRowAtIndexPath:方法中的行时重用UITableViewCell对象。 表视图维护数据源标记为可重用的UITableViewCell对象的队列或列表。 当被要求为表视图提供一个新的单元格时,从你的数据源对象调用这个方法。 此方法将取消现有单元格(如果有),或根据您之前注册的类或nib文件创build新单元格。

重要 :在调用此方法之前,必须使用registerNib:forCellReuseIdentifier:或registerClass:forCellReuseIdentifier:方法注册类或nib文件。

如果您为指定的标识符注册了一个类,并且必须创build一个新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格。 对于基于笔尖的单元格,此方法从提供的nib文件加载单元格对象。 如果现有的单元可用于重用,则此方法将调用单元的prepareForReuse方法。

这是我的新的cellForRowAtIndexPath在实现新方法后的样子:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"cell_identifier"; [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; return cell; } 

我到目前为止的代码工作正常,但总是返回默认样式。 我怎样才能改变这个,所以我可以创build其他样式的单元格,如UITableViewCellStyleDefaultUITableViewCellStyleValue1UITableViewCellStyleValue2UITableViewCellStyleSubtitle

我不想子类UITableViewCell ,我只是想改变默认的types,因为我可以做iOS 6之前。看起来很奇怪,苹果将提供增强的方法,但用最less的文档来支持其实施。

有没有人掌握了这个,或者遇到类似的问题? 我努力寻找任何合理的信息。

我知道你说你不想创build一个子类,但看起来不可避免。 基于在iOS 6.0模拟器中testing的汇编代码, UITableView通过执行UITableViewCell (或其子类)创build新的实例

 [[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>] 

换句话说,发送的样式( UITableViewCellStyleDefault )似乎是硬编码的。 为了解决这个问题,你将需要创build一个覆盖默认初始化方法initWithStyle:reuseIdentifier:的子类initWithStyle:reuseIdentifier:并传递你想使用的样式:

 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { // ignore the style argument, use our own to override self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier]; if (self) { // If you need any further customization } return self; } 

此外,最好发送registerClass:forCellReuseIdentifier:viewDidLoad ,而不是每次请求一个单元格时都这样做:

 - (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass:<RegisteredClass> forCellReuseIdentifier:<ReuseIdentifier>]; } 

dequeueReusableCellWithIdentifier不被弃用,所以你不需要使用新的dequeueReusableCellWithIdentifier:forIndexPath:

如果您正在使用自定义单元格类,请使用新的方法以及相应的注册方法(在viewDidLoad中),但如果要使用其中一个UITableViewCellStyle枚举,请使用旧方法。

您可以使用storyboard界面构build器来避免无关的子类:

  1. 在Storyboard视图中,select表视图单元格原型单元格(在表视图上)
  2. 在“实用程序”视图的“属性”检查器中,修改“样式”值
  3. (可选)修改其他值,如select和附件

新的iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath:在分配新单元格并返回时使用这些值。 (使用Xcode 4.5.2进行iOS 6.0编译testing)

保存一个文件的另一种方法是创build一个Nib,并使用registerNib:forCellReuseIdentifier:来代替。

制作笔尖很简单:在Interface Builder中创build一个新的.xib文件。 删除默认视图。 添加一个Table View Cell对象。 使用属性检查器,更改单元格的样式。 (在这里您还有机会通过调整其他属性来进一步定制单元格。)

然后在你的表视图控制器的viewDidLoad方法调用类似于:

 [self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"]; 

我的解决scheme是调用initWithStyle: reuseIdentifier:我已经获得它使用[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath] 。 毕竟, init只是另一个select器,编译器不会在已经初始化的对象上调用它。 然而,它会抱怨不使用调用init的结果,所以我这样做:

 UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]; cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"]; 

我想这不会在Swift中工作…