使用的是iOS 6的UITableView dequeueReusableCellWithIdent

2019-05-12 23:49发布

我试图找出如何设置UITableViewCellStyle使用iOS 6的新方法时UITableView

此前,在创建时UITableViewCell我会改变UITableViewCellStyle枚举时调用创建不同类型的默认细胞initWithStyle:但据我所知,这已不再是这种情况。

对于苹果文档UITableView指出:

返回值 :与相关联的重用标识符一个UITableViewCell对象。 此方法始终返回一个有效的细胞。

讨论 :出于性能原因,一个表视图的数据源应通常重用的UITableViewCell对象时将其分配细胞在其的tableView行:的cellForRowAtIndexPath:方法。 表视图维护队列或列表的对象的UITableViewCell该数据源已标记为重复利用。 当问及提供表视图的新细胞从数据源对象调用此方法。 如果有一个可用或创建一个基于你以前注册的类或笔尖文件一个新的这种方法从队列中现有的细胞。

重要提示 :调用此方法之前的方法:你必须注册使用registerNib类或笔尖文件:forCellReuseIdentifier:或的registerClass:forCellReuseIdentifier。

reuseIdentifier:方法如果你注册了一个类指定的标识符,并且必须创建一个新的细胞,这种方法通过调用其initWithStyle初始化的单元格。 对于基于笔尖细胞,这种方法加载从所提供的笔尖文件中的单元对象。 如果现有的电池是可重用,这个方法调用细胞的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,这似乎很奇怪,苹果将提供增强的方法,但用最小的文件来支持其实施。

有没有人掌握了这一点,或者类似的问题运行? 我挣扎在所有发现任何合理的信息。

Answer 1:

我知道你说你不想创建一个子类,但它看起来是不可避免的。 基于同时在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>];
}


Answer 2:

dequeueReusableCellWithIdentifier不会被弃用这样你就不会使用新的要求dequeueReusableCellWithIdentifier:forIndexPath:

使用新的方式与如果您使用的是自定义单元格类(在viewDidLoad中)相应的寄存器方法一起,但如果你想使用UITableViewCellStyle枚举一个用旧的方式。



Answer 3:

您可以通过使用故事板界面建设者避免外来的子类:

  1. 在故事板视图中,选择表视图细胞原型细胞(上表视图)
  2. 在实用程序查看,在属性检查器中,修改样式值
  3. (任选地)修改其他值,诸如选择与附件

新的iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath:分配新的细胞,并将其送回何时使用这些值。 (测试使用的Xcode 4.5.2在iOS 6.0编译)



Answer 4:

这节省了一个文件,另一种方法是创建一个笔尖和使用registerNib:forCellReuseIdentifier:代替。

使笔尖很简单:创建在Interface Builder一个新的.xib文件。 删除默认的视图。 添加表视图Cell对象。 使用属性检查器,更改样式为单元格。 (在这里,你也有机会通过调整其他属性进一步自定义单元格。)

然后在您的表视图控制器viewDidLoad方法调用是这样的:

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


Answer 5:

Bolot的答案是正确的。 简单,你不需要建立任何XIB文件。

我只是想更新他对谁使用斯威夫特,而不是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")
}


Answer 6:

我对这个解决方法是调用initWithStyle: reuseIdentifier:我一直在使用它获得后[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath] 毕竟, init是另一种选择,而编译器使得上称它已经初始化对象没有限制。 然而,它会抱怨没有使用初始化调用的结果,所以我做的:

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

我想这不会在斯威夫特工作...



文章来源: Setting style of UITableViewCell when using iOS 6 UITableView dequeueReusableCellWithIdentifier:forIndexPath: