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

Infinite loop while calling function in 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;
    }  
}

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

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

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

更新 selectedcell 后,在 tableView:didSelectRowAtIndexPath: 中调用 [tableView reloadData]

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

问题就在这里

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

您正在尝试从 table 获取手机。但细胞仍未创建。所以你return要创建单元格

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

仔细看你这个无限循环的问题,问题好像是InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];在新建cell对象的过程中调用了heightForRowAtIndexPath

我强烈建议重复使用 UITableViewCell

通常,您的委托方法应该做它们应该做的事情,而不是其他任何事情。此方法应该计算单元格的高度,而不是其他任何东西。

定义在header-

@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;

}