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

时间:2012-11-01 10:18:22

标签: uitableview ios6

我尝试在iOS 6中为UITableViewCellStyle使用新方法时尝试设置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;
}

到目前为止我的代码工作得很好,但总是返回默认样式。如何更改此设置以便我可以使用其他样式创建单元格,例如UITableViewCellStyleDefaultUITableViewCellStyleValue1UITableViewCellStyleValue2UITableViewCellStyleSubtitle

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

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

6 个答案:

答案 0 :(得分:104)

我知道你说你不想创建一个子类,但它看起来不可避免。基于在iOS 6.0模拟器中测试时的汇编代码,UITableView通过执行

创建UITableViewCell(或其子类)的新实例
[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]

换句话说,发送的样式(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;
}

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

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

答案 1 :(得分:60)

不推荐使用

dequeueReusableCellWithIdentifier,因此您无需使用新的dequeueReusableCellWithIdentifier:forIndexPath:

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

答案 2 :(得分:11)

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

  1. 在Storyboard视图中,选择表格视图单元格原型单元格(在表格视图中)
  2. 在“实用工具”视图的“属性”检查器中,修改“样式”值
  3. (可选)修改其他值,例如“选择和附件”
  4. 新的iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath:在分配新单元格并返回它们时会使用这些值。 (使用Xcode 4.5.2在iOS 6.0编译上测试)

答案 3 :(得分:7)

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

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

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

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

答案 4 :(得分:0)

Bolot的回答是正确的。简单,您不需要创建任何XIB文件。

我只想更新他的回答,无论是谁使用Swift而不是Objective-C:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .value1, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

答案 5 :(得分:-5)

我的解决方法是在使用initWithStyle: reuseIdentifier:获取[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]之后致电init。毕竟,UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]; cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"]; 只是另一个选择器,编译器对已经初始化的对象调用它没有任何限制。然而,它会抱怨没有使用调用init的结果,所以我这样做:

a.xml

我想这在Swift中不起作用......