0

我正在为我的应用程序创建一个设置视图,并且在该视图中是一个 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

4 回答 4

3

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

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

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

一旦你建立了那个单元格,你就可以告诉它它是行,但要注意当表格滚动时单元格会被回收,所以你必须在每次调用cellForRowAtIndexPath.

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

请参阅此处的 tableview 文档

于 2013-05-07T17:19:18.003 回答
0

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

于 2013-05-10T18:35:29.317 回答
0

你不应该layoutSubviews直接调用,一旦单元格准备好显示,iOS 会自动调用它。您还应该按照@danh 的建议对单元格进行双端队列。如果你对这一切不太满意,那么我真的建议你看看免费的 Sensible TableView 框架,它可以自动创建这些设置视图(我真的用几行代码创建了我的)。

于 2013-05-07T20:47:12.620 回答
0

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

于 2013-05-10T17:08:59.357 回答