2014-10-10 8 views
5

Ho una visione tabella con due righe in una sezione, cioèIn una vista tabella iOS, come deve essere spostata una riga in una nuova sezione?

--- 
Row A 
Row B 

Se voglio animare riga 1 in una nuova sezione, cioè l'essere risultato finale:

--- 
Row B 
--- 
Row A 

come dovrebbe questo essere realizzati? Quello che ho provato già è:

[self.tableView beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow: 0 inSection: 0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

Tuttavia, in iOS 8, almeno, la riga anima fuori, ma poi la nuova sezione è un rendering (cioè bianco, nessuna riga bordo inferiore) fino a qualche tempo dopo quando qualcosa innesca un ridisegno e ritorna.

[self.tableView beginUpdates]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

che solleva un'eccezione:

Invalid update: invalid number of sections. The number of sections contained in the table view after the update (2) must be equal to the number of sections contained in the table view before the update (1), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted). 

E:

[self.tableView beginUpdates]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

che solleva l'eccezione:

cannot move a row into a newly inserted section (1) 

devo solo non animare a tutti e ricaricare il tavolo intero?

+0

Forse è meglio separare il livello dati con il livello di visualizzazione. Cioè Carica i tuoi dati con l'origine dati progettata, magari array 2-D, quindi modifica l'array e chiama tableView.reload – zcui93

risposta

0
+0

. L'ho provato. Ho anche provato ad inserire la sezione e poi a spostare la riga. Entrambi producono eccezioni. – Nick

+0

Se ti muovi, ricevi: Aggiornamento non valido: numero di sezioni non valido. Il numero di sezioni contenute nella vista tabella dopo l'aggiornamento (2) deve essere uguale al numero di sezioni contenute nella vista tabella prima dell'aggiornamento (1), più o meno il numero di sezioni inserite o eliminate (0 inserito, 0 cancellato). – Nick

+0

Se si inserisce la sezione quindi si sposta, si ottiene: non è possibile spostare una riga in una sezione appena inserita (1) – Nick

0

ero in una situazione simile in cui mi è stato sempre l'eccezione cannot move a row into a newly inserted section (1). Ho trovato solo due soluzioni mezzo.

  1. Ricarica tavolo con reloadData() - aggressivo, e non le animazioni
  2. Elimina e inserire le righe, codice qui sotto:

self.requestTableView.deleteRowsAtIndexPaths([oldIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
self.requestTableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 

Per ottenere effetti animazioni che danno l'impressione di le righe in movimento, è possibile utilizzare UITableViewRowAnimation.Top durante l'eliminazione, l'inserimento o il ricaricamento delle sezioni.

self.tableView.deleteSections(toDelete, withRowAnimation: UITableViewRowAnimation.Top) 
self.tableView.insertSections(toInsert, withRowAnimation: UITableViewRowAnimation.Top) 
self.tableView.reloadSections(toReload, withRowAnimation: UITableViewRowAnimation.Top) 
4

È necessario eseguire questa operazione in due passaggi.

Per prima cosa è necessario aggiungere la sezione; devi dire alla tua fonte di dati di rappresentare la nuova sezione. Per un semplice esempio come la tua, si può solo impostare una variabile:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if(hasTwoSections) 
     return 2; 

    return 1; 
} 

Poi in cui si desidera attivare l'animazione, chiamare:

hasTwoSections = true; // this needs to be set before endUpdates 
[self.tableView beginUpdates]; 
[self.tableView insertSections:[NSIndexSet indexSetWithIndex: 1] withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView endUpdates]; 

A questo punto, il tableView chiamerà l'origine dei dati metodi per aggiornare la tabella in base alle tue modifiche.

Una volta che la sezione è stata aggiunta, è possibile spostare la riga in un altro blocco di aggiornamento:

[self.tableView beginUpdates]; 
[self.tableView moveRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] toIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
[self.tableView endUpdates]; 

Ovviamente avrete bisogno di aggiornare quello numberOfRowsInSection torna per tenere conto del cambiamento.

Anche se sono due passaggi, sembrerà che stia succedendo tutto in una volta.

+0

Se si sta eseguendo solo una operazione, non penso siano necessarie le date di inizio e fine. –

+0

È vero, le chiamate 'beginUpdates' e' endUpdates' non sono necessarie in questo esempio. – spongessuck

Problemi correlati