2015-02-25 11 views
20

UITableView aggiornamenti tra beginUpdates e endUpdates le chiamate vengono raggruppate insieme e tutte eseguite allo stesso tempo. documentazione di Apple è specifico circa l'ordine in cui vengono eseguite insert e delete operazioni:UITableView Elimina, Inserisci e sposta ordinamento in aggiornamenti batch

eliminazione e operazioni di ricarica all'interno di un blocco di animazione specificare quali righe e le sezioni nella tabella originale devono essere rimossi o ricaricati; gli inserimenti specificano quali righe e sezioni devono essere aggiunte alla tabella risultante. I percorsi indice utilizzati per identificare sezioni e righe seguono questo modello. L'inserimento o la rimozione di un elemento in un array mutabile, d'altra parte, può influire sull'indice dell'array utilizzato per l'operazione successiva di inserimento o rimozione; ad esempio, se si inserisce un elemento in un determinato indice, gli indici di tutti gli articoli successivi nell'array vengono incrementati.

E 'anche interessante notare che:

chiamate verso beginUpdates e endUpdates possono essere nidificate; tutti gli indici sono trattati come se ci fosse solo il blocco di aggiornamento esterno.

[enfasi è mia]

Quindi: pensare eliminazioni come si verificano in un primo passaggio, e poi eventuali inserimenti accadendo seguono questo, utilizzando le nuovi percorsi indice che si traducono dopo le eliminazioni .

Questo è utile. Tuttavia,, non ho trovato alcuna documentazione su dove si verificano le mosse di riga (e sezione), quale indicizzazione dovrebbero usare e se questo influisce sugli altri passaggi. Qualcuno sa?

+1

Provo a sostituire tableView.move con eliminazioni e inserimenti batch perché conosco l'ordine delle eliminazioni e delle inserzioni. Ma senza fortuna, la mossa sembra qualcosa di diverso. Questo mi ha fatto esitare usando gli aggiornamenti in batch con FetchedResultsController perché non so cosa fare con 'NSFetchedResultsChangeType.move'. Hai qualche progresso? – jchnxu

+0

Nessun'altra informazione, mi dispiace, probabilmente è possibile provarlo? – Benjohn

risposta

3

In caso di spostamento riga della tabella, è necessario specificare due indici:

  • indexPath in tabella originale da dove prendere questa riga
  • newIndexPath in tavolo risultante dove apparirà questa riga

    func moveRow (a indexPath: IndexPath, a newIndexPath: IndexPath)

Possibili operazioni in conflitto in unico lotto, causando crash del app:

  • cercando di spostare una riga anche l'eliminazione di
  • cercando di spostare stessa riga a più destinazioni
  • cercando di spostare più file a la stessa destinazione
  • cercando di spostare una riga per la stessa destinazione in cui si inserisce nuova riga

Non è possibile spostare una riga che si sta inserendo, perché non era presente nella tabella originale.

Per impostazione predefinita, la riga spostata non verrà ricaricata dall'origine dati.

+0

Ciao Paiv, grazie per aver risposto! Ho fatto questa domanda circa due anni fa e non sono attualmente in grado di convalidare la tua risposta! ... noto che esiste una taglia aperta che qualcun altro ha aggiunto: riuscirai a raccogliere questo se non avessi corretto la tua soluzione, a condizione che te lo concedessi? – Benjohn

+0

Per chiarire: penso che stai dicendo che possiamo pensare a mosse come se fossero eliminate e inserite combinate, per quanto riguarda il percorso dell'indice? La parte "cancella" dell'operazione di spostamento si verifica con altre eliminazioni (e utilizza l'indicizzazione iniziale). La parte di inserimento dell'operazione di spostamento si verifica con altri inserti (e utilizza l'indicizzazione di eliminazione post)? – Benjohn

+0

Questo sembra lasciare una domanda rimanente su come ordinare gli inserti (e inserire la parte delle mosse). Quindi, cosa succede se più di una riga viene inserita (o spostata) nello stesso indice? Hai detto che questo avrebbe causato un incidente in caso di trasloco. Quindi, come si inseriscono due righe all'inizio di un tavolo, per esempio? – Benjohn

Problemi correlati