为什么awakeFromNib从TableView中的Cell调用两次?

时间:2014-10-06 19:10:33

标签: ios objective-c uitableview xib

我试图理解为什么在我的代码中调用awakeFromNib两次。我目前有一个tableview,它有一个特殊的可压缩单元格,在表格末尾出现一次。当tableview在最后滚动到特殊单元格时,会调用第一个awakeFromNib(我相信这很好,因为tableview正在重用单元格)。但是,每当我点击单元格以扩展单元格时,都会再次调用awakeFromNib。

有人可以向我解释为什么awakeFromNib会被调用两次吗?我怎么只能让它只被叫一次?

由于

编辑**代码人员已要求

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (indexPath.section >= (NSInteger)[self.trip.destinations count]) {
        GuestCell *cell = (GuestCell*)[tableView dequeueReusableCellWithIdentifier:GuestCellIdentifier forIndexPath:indexPath];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        [cell setupCellForGuests:self.trip.guests];
        cell.guestExpanded = NO;
        NSLog(@"RETURNING CELL");
        return cell;
    }

    // For all other sections
    return [self prepareCardCellForIndexPath:indexPath forHeightCalc:NO];
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section >= (NSInteger)[self.trip.destinations count]) {
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

2 个答案:

答案 0 :(得分:4)

您正在为扩展行的重新加载设置动画。表视图通过为同一索引路径创建另一个单元格,并为从旧单元格到新单元格的转换设置动画来实现此目的。它会创建单元格原型的第二个实例,因此第二个实例也会收到awakeFromNib消息。如果您记录self,则第二次看到地址不同。

我不认为你可以避免创建第二个单元格实例(因此第二个awakeFromNib),除非你摆脱动画。即使这样,我也不确定它会重复使用旧电池。

答案 1 :(得分:2)

如果带有该笔尖的单元格只是表格中的一个,那么我的猜测是它与动画有关。我没有检查tableview在动画期间如何处理单元格,但是对于tableview标题,它要求另一个实例然后执行动画(例如淡入淡出) - 所以旧实例淡出而新的淡入淡出。至少那个&如果你正确处理细胞,那么我认为概率最高的是