-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//case 1
//The user is selecting the cell which is currently expanded
//we want to minimize it back
if(selectedIndex == indexPath.row)
{
selectedIndex = -1;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
return;
}
//case 2
//First we check if a cell is already expanded.
//If it is we want to minimize make sure it is reloaded to minimize it back
if(selectedIndex >= 0)
{
NSIndexPath *previousPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
selectedIndex = indexPath.row;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:previousPath] withRowAnimation:UITableViewRowAnimationFade];
}
//case 3
//Finally set the selected index to the new selection and reload it to expand
selectedIndex = indexPath.row;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
注意案例1和案例2是如何相关的展示已扩展的行,其中案例3是关于展开未展开的行。
expand和collapse都使用reloadRowsAtIndexPaths函数的相同功能。
对我来说,问题是切换按钮,当它被展开时,再次运行该功能会崩溃,当它崩溃时,它会扩展吗?
答案 0 :(得分:1)
当您致电reloadRowsAtIndexPaths:
时,表格视图会通过调用tableView:cellForRowAtIndexPath:
中UITableViewDataSource
的实施方式重新加载这些行。您可以在那里返回一个单元格,该单元格使用selectedIndex
变量来决定它是否应该显示为展开或折叠(对于您的特定应用程序而言意味着什么)。它还会在tableView:heightForRowAtIndexPath:
上调用UITableViewDelegate
(是的,这在委托中是愚蠢的)所以如果你的单元格高度发生变化,这个方法也应该返回一个取决于selectedIndex
的值。
此外,我建议您只拨打reloadRowsAtIndexPaths:
一次,如下所示:
NSMutableArray* rows = [NSMutableArray arrayWithCapacity:2];
// Case 2
if(selectedIndex >= 0)
{
NSIndexPath* previousPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
[rows addObject:previousPath];
}
// Case 3
selectedIndex = indexPath.row;
[rows addObject:indexPath];
[tableView reloadRowsAtIndexPaths:rows withRowAnimation:UITableViewRowAnimationFade];