8

Ho una UITableView con UIRefreshControl definita all'interno del metodo di una UIViewController come sotto viewDidLoad::UITableView sfarfallio con UIRefreshControl

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.refreshControl = [[UIRefreshControl alloc] init]; 
    [self.refreshControl addTarget:self action:@selector(refreshMessages) forControlEvents:UIControlEventValueChanged]; 
    UITableViewController *tableViewController = [[UITableViewController alloc] init]; 
    tableViewController.tableView = self.messagesTableView; 
    tableViewController.refreshControl = self.refreshControl; 
} 

- (void)refreshMessages { 
    //load data items 
    if ([self.refreshControl isRefreshing]) { 
     [self.refreshControl endRefreshing]; 
    } 

    [self.messagesTableView reloadData]; 
} 

Io uso cellule dimensionamento sé per aggiornare i dati di cella. Durante il nuovo caricamento dei dati, sullo sfarfallio dello UITableView. c'è un modo per evitarlo?

Modifica Ho collegato il file video per una demo di esempio. Lo UITableView su dati di ricarica, sfarfallio. Uso l'autolayout per aggiornare le altezze delle celle dinamiche.

Questo è un codice sample che può ricreare questo problema. UITableView dovrebbe essere tirato per aggiornare. La vista tabella viene ricaricata sulla coda principale. La cella viene ridimensionata con l'autolayout.


+0

Quindi hai un 'UIViewController' o un ' UITableViewController '? Dove viene presentato l'oggetto 'tableViewController' che si inizializza in viewDidLoad? Dovresti fornire maggiori informazioni, questo aiuterebbe – croX

+0

solo un colpo al buio ma hai provato [tableView beginUpdates/endUpdates]? –

risposta

1

Credo che il problema sta usando estimatedHeight & UITableViewAutomaticDimension con reloadData di UITableView. Questo è stato segnalato here

Il ritardo funzionerebbe ma non è ancora il modo giusto per raggiungerlo a meno che non si desideri un lavoro di hacker in giro.

4

Il problema è che si sta chiamando e -reloadData -endRefreshing insieme. Entrambi vogliono aggiornare la vista. Devi separarli un po '.

Una di queste opzioni funziona, a seconda di dove si desidera visualizzare le cellule aggiornare:

[self.tableView reloadData]; 
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.5]; 

[self.refreshControl endRefreshing]; 
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5]; 

Probabilmente avete bisogno di meno ritardo con la prima opzione. Anche 0,0 secondi sembravano funzionare nel tuo codice di esempio. Questo è sufficiente per ottenere l'animazione -endRefreshing al prossimo aggiornamento della schermata.

+0

Nessuno di loro funziona davvero. –

0
-(void)refreshMessages{ 

self.messages = [NSMutableArray new]; 
[self loadData]; 

[self.tableView reloadData]; 
[self.refreshControl endRefreshing]; 
} 
0

Può essere chiamando reloadData e endRefreshing potrebbe aver causato il tremolio di prendere posto così che cosa ho fatto è stato modificato il codice di un po 'e rimosso il blocco dispaccio che salvato sulla flick

- (void)refreshMessages{ 

self.messages = [NSMutableArray new]; 
[self loadData]; 
[self.tableView reloadData]; 
[self.refreshControl performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.5]; 


// double delayInSeconds = 0.5; 
// dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t) (delayInSeconds * NSEC_PER_SEC)); 
// dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
//  [self.refreshControl endRefreshing]; 
// }); 

} 
0

Avete provato?

[self.messagesTableView beginUpdates]; 
[self.messagesTableView reloadSections:[NSIndexSet indexSetWithIndex:0/*target section*/] withRowAnimation:UITableViewRowAnimationNone]; 
[self.messagesTableView endUpdates]; 

invece di:

[self.messagesTableView reloadData]; 
10

ho avuto lo stesso problema di oggi e sono riuscito a risolvere il problema utilizzando CATransaction, ecco un frammento di codice a Swift, realizzato all'interno di un UITableViewController:

 CATransaction.begin() 
     CATransaction.setCompletionBlock {() -> Void in 
      /*wait for endRefreshing animation to complete 
       before reloadData so table view does not flicker to top 
       then continue endRefreshing animation */ 

      self.tableView.reloadData() 
     } 

     self.refreshControl!.endRefreshing() 
     CATransaction.commit() 
+0

Avevo un problema di sfarfallio simile a quello che stava accadendo quando, mentre in fondo alla tableview, venivano aggiunte nuove righe in basso * e * le righe venivano cancellate dall'alto. Questo è stato risolto usando 'CATransaction.begin() ... CATransaction.setDisableActions (true) ... tableView.beginUpdates() ...fare gli aggiornamenti ... tableView.endUpdate() ... CATransaction.commit() ' – brki