我试图在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;
}
}
答案 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;
}