2013-09-27 18 views
14

Il seguente problema non si verifica nelle versioni IOS prima del 7.dequeueReusableCellWithIdentifier tornando cellule in modifica dello stato in IOS 7

Utilizzando l'interfaccia slide-a-edit di UITableView per gli elementi eliminazione, dopo l'eliminazione di un elemento e lo scorrimento, il nuova cellula visualizzata (tornato da dequeueReusableCellWithIdentifier) si presenta così:

https://dl.dropboxusercontent.com/u/87749409/Screenshot%202013.09.27%2016.08.30.png

[Quell'immagine potrebbe non essere disponibile per sempre, quindi ecco una descrizione: Dopo lo scorrimento, la nuova cella è ancora in stato modificato finale, con il pulsante DELETE ancora visibile e il contenuto della cella di f-screen a sinistra.]

Inoltre, la cella restituita ha anche il suo flag editing impostato.

Il codice che sto usando per eliminare le cellule si presenta così:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     // Find the item that this cell represents 
     NSDictionary *item = [self itemForRowAtIndexPath:indexPath]; 
     if (!item) return; 

     [tableView beginUpdates]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
     [tableView endUpdates]; 

     // Remove it from the data store 
     [Inventory removeInventoryItem:item]; 
    } 
} 

sono stato in grado di superare questa con una soluzione violato. Il codice (con hack) è:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    InventoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID]; 

    // HACK - here we create a new cell when we try to reuse deleted cells. 
    // Deleted cells, when re-used, would still appear as if they were edited, 
    // with the cell slid off to the far left and the DELETE button visible. 
    while(cell && cell.editing) 
    { 
     cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID]; 
    } 

    if (!cell) 
    { 
     cell = [[InventoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kInventoryCellID]; 
    } 

    return cell; 
} 

Con l'hack (il ciclo while) viene generata una nuova cellula che non è nello stato di editing. Questo porta a un po 'di memoria sprecata, ma produce il risultato corretto.

Mi chiedo se c'è qualcosa che devo fare nel metodo prepareForReuse per ripristinare lo stato di modifica. Attualmente, il mio metodo prepareForReuse inizializza solo i controlli interni (etichette, ecc.) Con valori predefiniti.

Ho provato a chiamare setEditing:animated: su entrambi, l'UITableViewCell e l'UITableView quando si elimina la cella, nella prepareForReuse e ogni volta che dequeueReusableCellWithIdentifier: restituito una cella che aveva ancora il set editing bandiera, ma nulla sembra risolvere il problema.

risposta

32

Ho avuto questo problema e la risposta per me è stato un "doh". Assicurati di chiamare l'implementazione super di prepareForReuse nella tua implementazione.

+2

Grazie Leo, è stato! Non avevo pensato di farlo visto che avevo esaminato questo problema (insieme ad alcuni altri) negli ultimi due giorni e nessuna delle implementazioni che ho incontrato ha effettivamente chiamato il prepreForReuse del super (ho appena controllato due volte). Come penitenza, pubblicherò una nota per quelle SO domande e blog che dovrebbero farlo. – pauln

+0

Cheers! Lo dice chiaramente nella documentazione, ma in effetti raramente si chiama. –

+1

PRIMA: "Perché leggere i documenti? So cosa fa ... viene chiamato per consentire di ripristinare una cella ai valori predefiniti prima di riutilizzarla." DOPO: "Ehi doc, ho questo punto piatto sulla mia fronte ..." – pauln

Problemi correlati