Non ho intenzione di dire nulla qui per contraddire la risposta accettata considerando che è perfettamente corretto. Tuttavia, ho intenzione di andare più nel dettaglio su come realizzare questo. Se non vuoi leggere tutto questo e sei più interessato a giocare con il codice sorgente in un progetto di lavoro, ho caricato uno example project to GitHub.
L'idea di base è quella di avere una condizione all'interno del metodo -tableView: heightForRowAtIndexPath:
che determina se la cella corrente debba essere espansa o meno. Questo verrà attivato chiamando gli aggiornamenti di inizio/fine sulla tabella dall'interno di -tableView: didSelectRowAtIndexPath:
In questo esempio, mostrerò come creare una vista tabella che consenta l'espansione di una cella alla volta.
La prima cosa che devi fare è dichiarare un riferimento a un oggetto NSIndexPath. È possibile farlo come vuoi, ma raccomando di usare una dichiarazione di proprietà come questa:
@property (strong, nonatomic) NSIndexPath *expandedIndexPath;
NOTA: Non è necessario creare questo percorso indice all'interno viewDidLoad, o qualsiasi altro metodo simile. Il fatto che l'indice sia inizialmente nullo significherà solo che inizialmente la tabella non avrà una riga espansa. Se si preferisce la tabella di iniziare con una fila di vostra scelta espanso, si potrebbe aggiungere qualcosa di simile per il metodo di viewDidLoad:
NSInteger row = 1;
NSInteger section = 2;
self.expandedIndexPath = [NSIndexPath indexPathForRow:row inSection:section];
Il passo successivo è quello di testa su oltre al UITableViewDelegate metodo -tableView: didSelectRowAtIndexPath:
per aggiungere la logica per modificare l'indice di cella espansa in base alla selezione degli utenti. L'idea qui è di controllare il percorso dell'indice che è stato appena selezionato rispetto al percorso dell'indice memorizzato all'interno della variabile expandedIndexPath
. Se i due sono una corrispondenza, allora sappiamo che l'utente sta cercando di deselezionare la cella espansa, nel qual caso, impostiamo la variabile su zero. Altrimenti, impostiamo la variabile expandedIndexPath
all'indice appena selezionato. Tutto ciò avviene tra le chiamate a beginUpdates/endUpdates, per consentire alla vista tabella di gestire automaticamente l'animazione di transizione.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView beginUpdates]; // tell the table you're about to start making changes
// If the index path of the currently expanded cell is the same as the index that
// has just been tapped set the expanded index to nil so that there aren't any
// expanded cells, otherwise, set the expanded index to the index that has just
// been selected.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
self.expandedIndexPath = nil;
} else {
self.expandedIndexPath = indexPath;
}
[tableView endUpdates]; // tell the table you're done making your changes
}
Poi il passo finale è in un altro metodo UITableViewDelegate-tableView: heightForRowAtIndexPath:
. Questo metodo verrà chiamato dopo aver attivato beginUpdates
una volta per ogni percorso dell'indice che la tabella determina l'esigenza di aggiornamento. Qui è dove si confronta il expandedIndexPath
con il percorso dell'indice che viene attualmente rivalutato.
Se i due percorsi di indice sono uguali, questa è la cella che si desidera espandere, altrimenti l'altezza dovrebbe essere normale. Ho usato i valori 100 e 44, ma puoi usare quello che si adatta alle tue esigenze.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Compares the index path for the current cell to the index path stored in the expanded
// index path variable. If the two match, return a height of 100 points, otherwise return
// a height of 44 points.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
return 100.0; // Expanded height
}
return 44.0; // Normal height
}
NOTA: Se si desidera che l'area estesa per contenere nuove cellule cliccabili (righe) (e non solo ha ampliato lo spazio per la cella cliccato), vedere [la risposta di gcamp] (http://stackoverflow.com/a/ 7253288/199364). Inizia con un insieme di * sezioni * che sono chiuse; fai clic sull'intestazione di una sezione per aprire quella sezione, mostrandone le celle. – ToolmakerSteve