在heightForRowAtIndexPath中调用函数时无限循环

时间:2015-05-29 10:57:19

标签: ios objective-c uitableview didselectrowatindexpath heightforrowatindexpath

我试图在heightForRowAtIndexPath中调用一个函数来隐藏和显示该单元格内的视图,但我不情愿地创建了一个无限循环。请指出问题是什么以及如何解决这个问题。

heightForRowAtIndexPath

中的功能
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"indexrow = %ld \n pre = %d\n sel = %d \n",(long)[indexPath row],previousselectedcell,selectedcell);
    if([indexPath row] == previousselectedcell){       
        return 60;
    }
    else if ([indexPath row] == selectedcell) {    
        NSLog(@"height toggle= %@",toggle);
        [self ViewToggle:tableView IndexPath:indexPath Do:@"true"];
        return 180;
    }
    else
    {
        return 60;
    }
}

功能定义

-(void)ViewToggle:(UITableView *)tableView IndexPath:(id)myindexPath Do:Toggle{
    InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];
    if([Toggle isEqualToString:@"true"]){
        cell.ContainerView.hidden=NO;
    }
    else{
        cell.ContainerView.hidden=YES;
    }  
}

5 个答案:

答案 0 :(得分:2)

问题出在这里

InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];

你正试图从桌子上获取细胞。但细胞仍未创造。所以你回到细胞创作

heightForRowAtIndexPath不是配置单元格内容的好地方。最好这样做 的tableView:didSelectRowAtIndexPath方法:  方法

答案 1 :(得分:1)

tableView:heightForRowAtIndexPath:只应用于返回行的高度。 tableView:cellForRowAtIndexPath:是隐藏逻辑的更合适的地方:

将以下内容添加到tableView:cellForRowAtIndexPath:

cell.ContainerView.hidden = (indexPath.row != selectedcell);

在更新[tableView reloadData]后,在tableView:didSelectRowAtIndexPath:中致电selectedcell

您还应该考虑存储NSIndexPath而不是整数,因为nil可以表示没有选择。

答案 2 :(得分:1)

严格关注无限循环的问题,问题似乎是InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];在创建新单元格对象的过程中调用heightForRowAtIndexPath

我强烈建议重复使用UITableViewCell

答案 3 :(得分:1)

通常,您的委托方法应该执行它们应该执行的操作而不执行任何其他操作。此方法应计算单元格的高度,而不是其他任何内容。

答案 4 :(得分:1)

在标题中定义 -

@property (nonatomic,retain) NSIndexPath *oldIndex;

请尝试使用以下代码而不是heightForRowAtIndexPath。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (self.oldIndex)
    {
        [self ViewToggle:tableView IndexPath:self.oldIndex Do:@"false"];
    }


    [self ViewToggle:tableView IndexPath:indexPath Do:@"true"];
    self.oldIndex=indexPath;

}