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