0
-(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 是关于展开未展开的行。

展开和折叠都使用与 reloadRowsAtIndexPaths 函数相同的函数。

我的问题是,一个切换按钮,当它展开时,再次运行该功能会折叠,当它折叠时,它会展开?

4

1 回答 1

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];
于 2012-06-11T19:05:00.383 回答