0

我试图调用一个函数,在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;
    }  
}
4

5 回答 5

2

问题就在这里

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

您正在尝试从表格中获取单元格。但细胞仍未创建。所以你回到细胞创建

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

于 2015-05-29T11:08:16.903 回答
1

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

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

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

[tableView reloadData]tableView:didSelectRowAtIndexPath:您更新后致电selectedcell

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

于 2015-05-29T11:07:44.787 回答
1

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

我强烈建议重用UITableViewCell's.

于 2015-05-29T11:09:23.467 回答
1

通常,您的委托方法应该做他们应该做的事情,而不是别的。此方法应计算单元格的高度,仅此而已。

于 2015-05-29T11:30:04.647 回答
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;

}
于 2015-05-29T11:35:32.603 回答