我使用[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
模式。我想将它保存在初始化程序中,因为它应该只运行一次,而不是每次单元格出列时。有没有正确的方法来实现这个目标?
答案 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。