具有自定义初始化程序的UITableViewCell dequeueReusableCellWithIdentifier

时间:2014-03-24 14:50:27

标签: ios iphone objective-c uitableview

我使用[UITableView registerClass: forReuseIdentifier:][UITableView dequeueReusableCellWithIdentifier:]来排队和出列UITableViewCells。

例如,在viewDidLoad中:

[self.storeTableView registerClass:[StoreLineGraphCell class] forCellReuseIdentifier:@"StoreLineGraphCellIdentifier"];

在cellForRowAtIndexPath中:

StoreLineGraphCell *cell = (StoreLineGraphCell*)[self.storeTableView dequeueReusableCellWithIdentifier:@"StoreLineGraphCellIdentifier"];

在执行此操作时,将为UITableViewCell调用initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier初始值设定项。问题是我需要使用自定义初始化程序来创建具有必要选项的单元格。例如,能够做这样的事情:

StoreLineGraphCell *cell = [[StoreLineGraphCell alloc] initWithReuseIdentifier:@"StoreLineGraphCell" isLocked:YES isUpcoming:YES];

registerClass& dequeue模式。我想将它保存在初始化程序中,因为它应该只运行一次,而不是每次单元格出列时。有没有正确的方法来实现这个目标?

3 个答案:

答案 0 :(得分:4)

当你按照通常的单元重用模式(就像你使用寄存器类和出队一样)时,我没有看到易于实现的方式。

如果我是你,我会创建一个额外的初始化方法(不遵循通常的init obj-c模式)或简单地设置并在dequeueReusableCellWithIdentifier调用后调用它。

StoreLineGraphCell *cell = (StoreLineGraphCell*)[self.storeTableView dequeueReusableCellWithIdentifier:@"StoreLineGraphCellIdentifier"];
[cell furtherInitWithLocked:YES andUpcoming:NO]; // ... or so

答案 1 :(得分:1)

您正在使用正确的registerClass和dequeue方法,但是要调用/设置自定义属性,您应该配置创建单独的方法并调用它。

而不是:

StoreLineGraphCell *cell = [[StoreLineGraphCell alloc] 
initWithReuseIdentifier:@"StoreLineGraphCell" isLocked:YES isUpcoming:YES];

你可以这样做:

StoreLineGraphCell *cell = // get the dequeue cell 
[cell configure]; 

在configure方法中,您可以设置属性,如下所示:

-(void) configure 
{
   self.isLocked = YES; 
   self.isUpcoming = YES; 
}

答案 2 :(得分:1)

这是我今天遇到的一个常见问题 但是,它可以像这样解决 因为在dequeueReusableCellWithIdentifier方法之前注册的单元类在执行后被调用  cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]
单元格始终不是 nil 并返回到 - initWithStyle:style reuseIdentifier:reuseIdentifier
您似乎无法自定义自己的 init 方法 但是,如果您之前未注册过单元格类,那么如果tableview没有可重复使用的单元格,则dequeueReusableCellWithIdentifier将返回 nil
因此,我们应该检查dequeueReusableCellWithIdentifier返回的单元格值,如果它是零,那么我们可以使用自定义方法 init

cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]
if (!cell) {
    cell = /* custom init method */
}

那已经完成了! 如果我们想定制子类cell init方法,那么不要在之前注册cell class。