自定义单元格,只有最后一个单元格获得[layoutSubviews]?

时间:2013-05-07 17:15:29

标签: iphone ios objective-c ios6 uitableview

我正在为我的应用创建一个设置视图,在该视图中是一个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。有什么建议吗?

4 个答案:

答案 0 :(得分:3)

请勿直接致电layoutSubviews。使用[self setNeedsLayout][self layoutIfNeeded]。但是不要在单元格的init方法中调用这些。

另外,不要调用[[TableCell alloc] initWithType:indexPath.row];直接,或者。相反,使用......

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

一旦你构建了那个单元格,你可以告诉它它是行,但要注意单元格在表格滚动时被回收,所以你必须在每次调用cellForRowAtIndexPath时更新该值。

当调整表格视图大小时,单元格应该再次进行布局(无需直接或间接进行任何调用)。

请参阅tableview doc here

答案 1 :(得分:0)

你永远不应该直接打电话给layoutSubviews,一旦电池准备好显示,它将由iOS自动调用。你也应该像@danh推荐的那样去除细胞。如果你对这一切都不是很满意,那么我真的建议你看看免费的Sensible TableView框架,它可以自动创建这些设置视图(我真的创建了几行)。 / p>

答案 2 :(得分:0)

问题出在我自己糟糕的代码上。使用cell.backgroundView在这里帮了很多忙。

答案 3 :(得分:0)

永远不要自己调用layoutSubviews。当单元格中的子视图帧被更改时,将调用它。即使只更改自定义单元格中的标签文本也不会调用layoutSubviews。用于细胞的细胞以重复使用以获得更好的性能。因为它不会每次分配细胞。并且你的代码看起来有很多内存问题,因为分配的单元格不会被释放并且新的单元格被创建。