2013-05-07 73 views
0

我为我的应用程序创建一个设置视图,并在该视图中是一个UITableView。我正在创建自定义单元格来满足我的需求,但是我遇到了问题 - 只有最后一个单元格获得[layoutSubviews]。难道我做错了什么?自定义单元格,只有最后一个单元格获取[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 

不断,只有最后一个单元格#6,据报道,当我旋转,或当layoutSubviews应该叫。有什么建议么?

回答

0

这个问题是我自己糟糕的代码。在这里使用cell.backgroundView帮助了很多。

3

请勿直接拨打layoutSubviews。使用[self setNeedsLayout][self layoutIfNeeded]。但是不要在单元格的init方法中调用它们。

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

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

一旦你已经建立了电池,你可以告诉它,它的行,但要注意的是,细胞得到回收作为表滚动,所以你必须在更新值每次致电cellForRowAtIndexPath

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

查看tableview doc here

+0

谢谢你的详细解答。但即使使用[self setNeedsLayout],而不是直接调用layoutSubviews,只有最后一行在旋转视图时才会获取layoutSubviews。 – mattsven 2013-05-07 17:44:17

+0

我应该更仔细地阅读你的代码。 (布局子视图错误超过了我的注意力,这些应该肯定会被删除)。我编辑了答案。首先获得正确构建的单元格,布局应该可以正常工作。如果没有,在旋转时尝试tableView reloadData,但你不应该需要它。 – danh 2013-05-07 19:37:11

+0

我没有使用可重复使用的单元格,因为这将是一个设置视图,并且它是少量的单元格。不管如何,它似乎都不起作用。 – mattsven 2013-05-07 22:12:45

0

你不应该直接调用layoutSubviews,它会在iOS准备好显示时自动被iOS调用。你也应该像@danh推荐的那样使单元出队。如果你对这一切不是很满意,那么我真的建议你看看免费的Sensible TableView框架,它可以自动创建这些设置视图(我真的在几行中创建我的视图)。

0

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

+0

是的,我做了很多改变,因为它允许分配和重用,并解决了这个问题。谢谢你的笔记! – mattsven 2013-05-12 08:00:18

相关问题