2016-02-21 8 views
5

Sono stato sbattere la testa su questo problema per ore, ma ogni volta che provo qualcosa di simile:Perché insertRowsAtIndexPath fa sempre in modo che TableView scorra verso l'alto?

self.dataArray.append(newCellObj) 

e poi faccio questo:

self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

L'UITableView farà scorrere automaticamente la parte superiore della pagina.

anche se cerco:

self.tableView.scrollEnabled = false 
    self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

L'UITableView sarà ancora scorrere verso l'alto anche con lo scorrimento completamente disattivato. Che cosa fa sì che ScrollView scorra in cima dopo che insertRowsAtIndexPaths viene chiamato?

L'unica soluzione che ho per questo problema è quello di utilizzare questo:

self.tableView.reloadData() 

invece. Se uso reloadData invece che va bene, ma poi perdo la bella animazione che mi piacerebbe davvero mantenere.

devo anche self.tableView.scrollsToTop = false e ho provato molte altre configurazioni come quella che potrebbe disabilitare lo scorrimento in qualche modo, ma, c'è qualcosa che prevale questo dopo insertRowsAtIndexPaths

+3

Penso che potresti avere qualche altro codice che reagisce male qui. Hai ragione che non dovrebbe scorrere verso l'alto. Hai provato a farlo senza essere tra gli aggiornamenti di inizio/fine? C'è qualche altro codice che * potrebbe * essere rilevante? –

+1

@RyanPoolos Grazie amico, funziona meglio senza gli aggiornamenti di inizio/fine per me. : D –

risposta

12

stavo incontrando lo stesso problema di OP. Addizionalmente, a volte alcune delle mie celle di visualizzazione tabella diventano "vuote" e scompaiono del tutto, il che mi ha portato a this related question.

Per me, la soluzione era di fare una delle seguenti operazioni:

  • attuare func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  • disabilita layout automatico
  • impostare una più accurata estimatedRowHeight sul mio UITableView
+3

GRAZIE! 'EstimateHeightForRowAtIndexPath' sembra aver risolto completamente il problema! Sembra che serva più di un 'altezza massima per riga al percorso indice, quando imposto questo valore su qualcosa di molto superiore alla cella media nel mio TableView, sembra che abbia fatto il trucco. E sono anche riuscito a mantenere attivo il 'layout automatico '! : D Ho molte di queste funzioni di "visualizzazione tabella di aggiornamento" in tutto il mio progetto, ognuna delle quali riguarda una classe di celle completamente diversa, e il trucco stimato di altezza ha risolto ognuna di esse. L'alternativa a questo credo sia manuale heightForRowAtIndexPath. – Mateusz266

+2

Sei una leggenda !!! Grazie mille!!! – Gix

+0

Ho lo stesso problema ma 'estimateHeightForRowAtIndexPath' e' EstimateRowHeight' non hanno funzionato. – lee

0
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

// I'm use auto layout and this variant without animation works 
// ...insert object to datasource 
NSUInteger idx = [datasource indexOfObject:myNewObject]; 
if (NSNotFound != idx) 
{ 
    NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:0]; 
    [self.table beginUpdates]; 
    [self.table insertRowsAtIndexPaths:@[path] 
         withRowAnimation:UITableViewRowAnimationNone]; 
    [self.table endUpdates]; 
    [self.table scrollToRowAtIndexPath:path 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:NO]; 
}