在UITableView reloadRowsAtIndexPaths上消失了UITableViewCell:

时间:2013-08-13 16:06:55

标签: ios objective-c uitableview uikit

我有一些UITableViewCells,我从XIB文件加载。一切都很好,直到我在单元格消失时调用[UITableView reloadRowsAtIndexPaths:withRowAnimation:]方法。当我调用[UITableView reloadData]时,所有加载都会找到,当我在视图上滚动单元格时,它也会重新出现。怪异。

我还注意到,当我调用[UITableView reloadRowsAtIndexPaths:withRowAnimation:]时,UITableView将不会尝试重用缓存的单元格,并尝试使用cell = [tableViewCells objectAtIndex:cellId];

这是我的代码:

- (void)viewDidLoad
{
    ...
    // the objects from the XIB files are loaded onto an NSArray instance variable at viewDidLoad
    tableViewCells = [[NSBundle mainBundle] loadNibNamed:@"ProfileTableViewCell" owner:nil options:nil];
    ...
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    int cellId = /* some logic to get the correct cellID */
    NSString *CellIdentifier = [NSString stringWithFormat:@"ProfileTableViewCell_%d", cellId];
    ProfileTableViewCell *cell = (ProfileTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [tableViewCells objectAtIndex:cellId];
        // additional work to setup subviews for the cell
        [cell prepareSubviews];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }
}

以防万一我在[ProfileTableViewCell prepareSubviews]中正在做的一些事情

- (void)prepareSubviews
{
    ...
    [self.containerView.layer setCornerRadius:3];
    [self.containerView.layer setBorderColor:UIColorFromRGB(0xCDCDCD).CGColor];
    [self.containerView.layer setBorderWidth:2.0];
    [self.containerView.layer setMasksToBounds:YES];
    [self.containerView.layer setShouldRasterize:NO];
    [self.containerView.layer setRasterizationScale:[UIScreen mainScreen].scale];
    ...
}

提前感谢那些可以帮助我的人。

2 个答案:

答案 0 :(得分:1)

我不确定这是你的问题,但你获得细胞的方式并不正常。您应该将每种类型的单元格放在它自己的nib中(使用唯一标识符),然后使用registerNib:forCellReuseIdentifier:注册nib。在cellForRowAtIndexPath中,只需根据索引路径将所需的单元格出列,并且不要在if(cell == nil)子句中放置任何内容,因为当你这样做时不会调用它。

答案 1 :(得分:0)

它接缝reloadRowsAtIndexPaths:当你只需要改变静态单元格的高度时,它不起作用。

尝试拨打

[tableView beginUpdates];
[tableView endUpdates];

正如文件所说:

  

您也可以使用此方法,然后使用endUpdates方法   在不重新加载单元格的情况下为行高的变化设置动画。