使用iOS 6时设置UITableViewCell样式UITableView dequeueReusableCellWithIdentifier:forIndexPath:
我想解决如何设置UITableViewCellStyle
在UITableViewCellStyle
使用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其他样式的单元格,如UITableViewCellStyleDefault
, UITableViewCellStyleValue1
, UITableViewCellStyleValue2
和UITableViewCellStyleSubtitle
?
我不想子类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器来避免无关的子类:
- 在Storyboard视图中,select表视图单元格原型单元格(在表视图上)
- 在“实用程序”视图的“属性”检查器中,修改“样式”值
- (可选)修改其他值,如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中工作…