2015-06-09 5 views
7

Ho permesso all'utente di riordinare le righe in tableView. Poiché questo evento influisce sul contenuto: alcuni valori numerici nelle celle devono essere aggiornati: in tutte le altre righe, chiamo uno reloadData in moveRowAtIndexPath. E poi si verificano effetti strani.Come ricaricare tableview dopo aver riordinato una riga? Le file hanno un'altezza variabile

I.e. le celle sembrano sovrapposte quando si tocca il trascinatore e alcune celle iniziano a muoversi su e giù. È importante sapere che l'altezza delle celle è variabile.

Lo strano, che se rimuovo reloadData da moveRowAtIndexPath, allora tutti questi fenomeni scompaiono. Solo il contenuto non è valido.

Quindi, come devo ricaricare i dati dopo il riordino?


UPDATE: Quello che ho fatto le cellule frattempo la riconfigurazione in viewDidLayoutSubviews invece di chiamata reloadData fine del moveRowAtIndexPath. E funziona al 90% come mi aspetto, ma le righe ancora sono a volte un po 'più alte che dovrebbero.

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 

    //.. 

    reorderOccured = true 
} 

override func viewDidLayoutSubviews() { 

    if reorderOccured { 

     for cell in tableView.visibleCells() as! [UITableViewCell] { 

      let ip = tableView.indexPathForCell(cell) 
      if ip != nil { 
       self.configureCell(cell, indexPath: ip!) 
      } 
     } 

     reorderOccured = false 
    } 
} 
+0

potresti trovare interessante anche questo: http://stackoverflow.com/questions/30758111/an-extra-view-appears-in-cell-when-pressing-reorder-dragger-why –

risposta

3

ho trovato qui la risposta: https://stackoverflow.com/a/4692563/239219

[tableView beginUpdates]; 
[tableView endUpdates]; 

Questo codice impone UITableView per ricaricare dimensioni delle celle solo, ma non del contenuto delle celle.

+0

Questo è stato anche menzionato in questi anni WWDC durante le migliori pratiche di Cocoa Touch http://asciiwwdc.com/2015/sessions/231?q=cocoa%20touch%20best%20practices –

2

Non è necessario chiamare reloadData dopo il riordino. È necessario apportare le stesse modifiche ai dati, come le modifiche apportate sullo schermo. Ad esempio: se hai spostato la cella nr 2 alla posizione 6, devi rimuovere l'oggetto che popola la cella n. 2 e reinserirlo nella posizione 6. Non hai fornito abbastanza dettagli, ma di solito manterresti i tuoi dati in una serie di oggetti. In questo array è necessario apportare le modifiche, pertanto la propria origine dati di backup è valida.

Ecco uno link per i dettagli da Apple.

Ho appena letto l'aggiornamento dopo aver postato la mia risposta. Sembra che tu abbia davvero bisogno di reloadData. In questo caso, consiglio di ricaricare dopo un piccolo ritardo con un blocco dispatch_async sul thread principale. Dì dopo 0.1.

+0

se leggi l'UPDATE- parte, non chiamo più 'reloadData', ma chiamo 'reconfigureCell' per ogni cella, in' viewDidLayoutSubviews', ma a volte mi capita di sovrapporre fenomeno –

+0

stai riutilizzando la stessa cella per altezza diversa?quindi è il motivo –

+0

relativo all'articolo che hai collegato, se le file hanno la stessa altezza allora ** il fenomeno di sovrapposizione non aumenta ** –

0

Non riesco ancora a commentare la risposta di pteofil, ma è corretto: se si dispone di un numero numerato di righe in una tabella e si sposta una voce moveRow (...), l'animazione per la mossa sarà annullato da una tabellaView.reloadData().

Come tale ho ritardato il caricamento dei dati (che rinumera tutte le celle visibili basate sull'origine dati aggiornata (non dimenticare di farlo quando muovi tutto!)) Un paio di centinaia di millisecondi e funziona perfettamente ora e sembra grande anche

Problemi correlati