UITableViewCell展开和折叠

时间:2012-06-11 18:42:21

标签: ios uitableview

-(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函数的相同功能。

对我来说,问题是切换按钮,当它被展开时,再次运行该功能会崩溃,当它崩溃时,它会扩展吗?

1 个答案:

答案 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];