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

Cap*_*uff 81 uitableview ios6

我正在尝试解决如何设置UITableViewCellStyle在iOS 6中使用新方法的时间UITableView.

以前,在创建时UITableViewCell我会更改UITableViewCellStyle枚举以在调用时创建不同类型的默认单元格,initWithStyle:但是从我可以收集的内容来看,情况不再如此.

UITableView州的Apple文档:

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

讨论:出于性能原因,表视图的数据源通常应该在将单元格分配给其tableView:cellForRowAtIndexPath:方法中的行时重用UITableViewCell对象.表视图维护数据源已标记为可重用的UITableViewCell对象的队列或列表.当要求为表视图提供新单元格时,从数据源对象中调用此方法.如果现有单元格可用,则此方法会使现有单元格出列,或者根据先前注册的类或nib文件创建新单元格.

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

如果为指定的标识符注册了类并且必须创建新的单元格,则此方法通过调用其initWithStyle:reuseIdentifier:方法来初始化该单元格.对于基于nib的单元格,此方法从提供的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;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码工作正常,但总是返回默认样式.我怎样才能改变这个,所以我可以创建细胞与其他风格,比如UITableViewCellStyleDefault,UITableViewCellStyleValue1,UITableViewCellStyleValue2UITableViewCellStyleSubtitle

我不想继承子类UITableViewCell,我只想改变默认类型,就像我在iOS 6之前所做的那样.看起来很奇怪Apple会提供增强的方法,但只需要很少的文档来支持它们的实现.

有没有人掌握这个,或遇到类似的问题?我很难找到任何合理的信息.

bol*_*lot 105

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

[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]
Run Code Online (Sandbox Code Playgroud)

换句话说,sent(UITableViewCellStyleDefault)样式似乎是硬编码的.要解决这个问题,您需要创建一个子类来覆盖默认的初始化程序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;
}
Run Code Online (Sandbox Code Playgroud)

此外,最好是registerClass:forCellReuseIdentifier:viewDidLoad每次请求单元格时发送,而不是执行此操作:

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

  • 不要忘记,您可以使用旧的iOS5方法,而不是子类,它仍然有效.这样您就可以初始化自己想要的任何类型的单元格样式.看到另一个答案. (11认同)
  • 我开始认为确实如此.这不是一个主要问题,但必须将"UITableViewCell"子类化以获取其他默认样式是一件痛苦的事情,因为它只会创建不必要的文件.感谢您的评论并确认我的怀疑. (4认同)

Mur*_*gal 60

dequeueReusableCellWithIdentifier不推荐使用,因此您不需要使用新的dequeueReusableCellWithIdentifier:forIndexPath:.

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


Jef*_*ier 11

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

  1. 在Storyboard视图中,选择表视图单元格原型单元格(在表视图中)
  2. 在"实用工具"视图的"属性"检查器中,修改"样式"值
  3. (可选)修改其他值,例如"选择"和"附件"

新的iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath:在分配新单元格并返回它们时确实使用了这些值.(使用Xcode 4.5.2在iOS 6.0编译上测试)


Mr.*_*rna 7

保存一个文件的另一种方法是创建一个Nib并使用它registerNib:forCellReuseIdentifier:.

使Nib变得简单:在Interface Builder中创建一个新的.xib文件.删除默认视图.添加表视图单元对象.使用"属性"检查器,更改单元格的样式.(此处您还可以通过调整其他属性来进一步自定义单元格.)

然后在你的表视图中控制器的viewDidLoad方法调用如下:

[self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"];
Run Code Online (Sandbox Code Playgroud)