我正在为我的应用创建一个设置视图,在该视图中是一个UITableView。我正在创建自定义单元格以满足我的需求,但我遇到了问题 - 只有最后一个单元格正在[layoutSubviews]
。我做错了吗?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//int type = (indexPath.row == 0?1:0);
//if(indexPath.row == 6) type = 2;
NSLog(@"row %i created", indexPath.row);
TableCell *cell = [[TableCell alloc] initWithType:indexPath.row];
cell.textLabel.text = @"Test cell";
return cell;
}
在我的自定义单元格中:
@implementation TableCell
UIImageView *shadowView;
int row;
- (id) initWithType:(int)type {
row = type;
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
self.backgroundColor = [UIColor clearColor];
self.backgroundView = [[UIView alloc] init];
UIImage *shadowImage = [UIImage imageNamed:@"CellShadow"];
shadowImage = [shadowImage resizableImageWithCapInsets:UIEdgeInsetsMake(14, 14, 14, 14)];
shadowView = [[UIImageView alloc] initWithImage:shadowImage];
[self.contentView addSubview:shadowView];
//[self.contentView sendSubviewToBack:shadowView];
NSLog(@"agreed, row %i created", row);
[self layoutSubviews];
return self;
}
- (void) layoutSubviews {
NSLog(@"row: %i", row);
[super layoutSubviews];
shadowView.frame = CGRectMake(
0, 0,
self.contentView.frame.size.width,
self.contentView.frame.size.height
);
}
@end
接下来,当我旋转或者应该调用layoutSubviews时,仅报告最后一个单元格#6。有什么建议吗?
答案 0 :(得分:3)
请勿直接致电layoutSubviews
。使用[self setNeedsLayout]
或[self layoutIfNeeded]
。但是不要在单元格的init方法中调用这些。
另外,不要调用[[TableCell alloc] initWithType:indexPath.row];直接,或者。相反,使用......
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath
一旦你构建了那个单元格,你可以告诉它它是行,但要注意单元格在表格滚动时被回收,所以你必须在每次调用cellForRowAtIndexPath
时更新该值。
当调整表格视图大小时,单元格应该再次进行布局(无需直接或间接进行任何调用)。
答案 1 :(得分:0)
你永远不应该直接打电话给layoutSubviews
,一旦电池准备好显示,它将由iOS自动调用。你也应该像@danh推荐的那样去除细胞。如果你对这一切都不是很满意,那么我真的建议你看看免费的Sensible TableView框架,它可以自动创建这些设置视图(我真的创建了几行)。 / p>
答案 2 :(得分:0)
问题出在我自己糟糕的代码上。使用cell.backgroundView
在这里帮了很多忙。
答案 3 :(得分:0)
永远不要自己调用layoutSubviews。当单元格中的子视图帧被更改时,将调用它。即使只更改自定义单元格中的标签文本也不会调用layoutSubviews。用于细胞的细胞以重复使用以获得更好的性能。因为它不会每次分配细胞。并且你的代码看起来有很多内存问题,因为分配的单元格不会被释放并且新的单元格被创建。