2014-10-06 74 views
0

我想了解为什么awakeFromNib在我的代码中被调用两次。我目前有一个tableview,它有一个特殊的可压缩单元格,它在表格的最后出现一次。第一个awakeFromNib在tableview被滚动到最后的特殊单元格时被调用(这很好,我相信,因为tableview正在重用单元格)。但是,无论何时点击单元格以展开单元格,都会再次调用awakeFromNib。为什么awakeFromNib从TableView中的单元格调用两次?

任何人都可以向我解释为什么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]; 
    } 
} 
+0

分享您的代码? – Bejibun 2014-10-06 19:12:59

+0

如果您只是实例化一个单元,则不应调用两次,因此我们需要查看cellForRowAtIndexPath和didSelectRowAtIndexPath中的代码。 – rdelmar 2014-10-06 19:16:46

+0

编辑您的帖子以包含展开单元格的代码。你如何让表格视图知道单元格应该展开?它是动画吗? – 2014-10-06 19:39:13

回答

1

如果与笔尖的细胞中只有一个表,然后我的猜测是,它是与动画。我没有检查tableview在动画过程中如何处理单元格,但是为tableview头部请求另一个实例,然后执行动画(例如淡入淡出) - 所以旧实例淡出,新的淡入淡出。至少这就是我如果您正在正确处理单元格,则认为它的概率最高。

1

您正在为正在展开的行重新加载动画。表格视图通过为相同的索引路径创建另一个单元格并将从旧单元格到新单元格的过渡动画化来实现此目的。它创建您的细胞原型的第二个实例,因此第二个实例也收到awakeFromNib消息。如果你登录self,你会发现第二次地址不同。

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

相关问题