UITableViewCell expandir y contraer

-(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];

}

Observe cómo el caso 1 y el caso 2 están relacionados al colapsar la fila ya expandida, mientras que el caso 3 se trata de expandir la fila no expandida.

Tanto la expansión como la contracción usan la misma función de la función reloadRowsAtIndexPaths.

La pregunta para mí es que un botón de alternar, cuando está expandido, ejecutar esa función nuevamente colapsará y cuando esté colapsado, ¿se expandirá?

preguntado el 11 de junio de 12 a las 19:06

1 Respuestas

Lo que va a pasar es que cuando llames reloadRowsAtIndexPaths: la vista de tabla recargará esas filas llamando a su implementación de tableView:cellForRowAtIndexPath: en tu UITableViewDataSource. Depende de usted devolver una celda allí que use el selectedIndex variable para decidir si debe aparecer expandida o colapsada (lo que sea que eso signifique para su aplicación específica). también llamará tableView:heightForRowAtIndexPath: en su UITableViewDelegate (sí, es una tontería que esto esté en el delegado), por lo que si la altura de su celda cambia, este método también debería devolver un valor dependiendo de selectedIndex.

Además, le sugiero que solo llame reloadRowsAtIndexPaths: una vez, así:

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

Respondido el 11 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.