我有一个表视图,其中单元格具有可变高度。这会导致重用标识符出现问题,但我真的很喜欢Apple给我的UITableViewCells缓存。因此,我尝试制作一个变量重用标识符似乎但我不确定它是否是正确的方法。
有人能告诉我,我是否正在处理多个重用标识符?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
float height = [self calcCellHeight:indexPath];
NSString *CellIdentifier = [NSString stringWithFormat:@"TextCell_%f", height];
TextCell *textCell = (TextCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (textCell == nil) {
textCell = [[TextCell alloc] initWithHeight:height reuseIdentifier:CellIdentifier];
}
return textCell;
}
答案 0 :(得分:3)
执行此操作的最佳方法可能是每次获取单元格时设置高度,然后重新计算该setter中的所有内部单元格框架。这是一个例子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
float height = [self calcCellHeight:indexPath];
TextCell *textCell = (TextCell *)[tableView dequeueReusableCellWithIdentifier: @"AlwaysTheSame"];
if (textCell == nil) {
textCell = [[[TextCell alloc] init] autorelease];
}
[textCell setHeight: height];
return textCell;
}
另外,请注意,您第一次忘记了自动发布。
// TextCell
- (id) init {
if ([super initWithStyle: UITableViewCellStyleDefault
reuseIdentifier: @"AlwaysTheSame"]) {
self.myInternalStuff = [[[MyInternalStuff alloc] initWithFrame: CGRectZero] autorelease];
// I don't know what size I am yet!
}
return self;
}
- (void) setHeight: (CGFloat) height {
self.myInternalStuff.frame = CGRectMake(0, 0, 100, height);
// I know what height I am now, so I can lay myself out!
}
答案 1 :(得分:0)
你可以做到这一点,但如果细胞高度变化很大,那么它几乎会破坏缓存细胞的目的。毕竟,如果缓存中有50种不同大小的单元格,则不会节省太多时间或内存。
如果您打算这样做,我建议使用int而不是float来构造标识符。