2014-04-26 13 views
5

Il problema è che l'interfaccia utente appare e quindi viene aggiornata: dando un effetto sfarfallio.[self.tableview reloadData]; provoca sfarfallio

Voglio che l'interfaccia utente venga aggiornata una sola volta quando l'utente accede all'app, quindi ho ricaricato in ViewDidLoad. Ecco il codice .. Qualsiasi aiuto come può rimuovere questo sfarfallio ... Alcuni esempi di codice potrebbero aiutare.

- (void)viewDidLoad { 

[super viewDidLoad]; 

self.myTableView.dataSource = self; 
self.myTableView.delegate = self; 

PFQuery * getCollectionInfo = [PFQuery queryWithClassName:@"Collection"]; // make query 

[getCollectionInfo orderByDescending:@"updatedAt"]; 
[getCollectionInfo setCachePolicy:kPFCachePolicyCacheThenNetwork]; 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 
    [getCollectionInfo findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      CollectionQueryResult = (NSMutableArray *)objects; 
       [self.tableView reloadData]; 


      // whenevr get result 
     } 
     else{ 
      //no errors 
     } 


    }]; 
}); 
+0

qual è il tuo problema, ti preghiamo di elaborare la tua domanda. – iPatel

+0

Il problema è che l'interfaccia utente appare e quindi viene aggiornata: dando un effetto sfarfallio. – user3576169

+0

Richiedo che le celle vengano aggiornate senza lo sfarfallio completo di TableView. Ho consultato questo http://stackoverflow.com/questions/11631104/uitableview-reloaddata-how-to-stop-flicker ma non ha aiutato – user3576169

risposta

1

Speranza righe sottostanti possono aiutare a ritardare e tremolante problemi

dispatch_async(dispatch_get_main_queue() 
        , ^{ 
[self.tableView reloadData]; 

}); 
+0

ancora Flicker .. – user3576169

+0

in realtà tableview ricarica solo le celle visibili di default –

+1

** Capisco che devo farlo. ** '[self.tableView reloadRowsAtIndexPaths: [self.tableView indexPathsForVisibleRows] withRowAnimation: UITableViewRowAnimationNone];' ** Ma questo dà un errore: ** 'NSInternalInconsistencyException', motivo: 'Aggiornamento non valido: numero di righe non valido nella sezione 0. – user3576169

1

Il download è asincrona, in modo da non completare prima che viene mostrata la vista. Quindi, tutto ciò che hai in CollectionQueryResult verrà visualizzato.

Si potrebbe o:

  1. chiaro CollectionQueryResult in modo che la tabella non è popolata fino ad ottenere un aggiornamento
  2. Confronta CollectionQueryResult e objects, quindi aggiornare solo le celle visibili in cui i dati sono stati modificati (prima di impostare CollectionQueryResult)

si noti che per l'opzione 2 sarà anche necessario per confrontare il conteggio di CollectionQueryResult e objects e poi inserire/eliminare r ows dalla vista tabella come appropriato. L'intero punto dell'opzione 2 è di non chiamare reloadData, quindi è necessario fare molto più lavoro ...

È anche possibile evitare di chiamare reloadRowsAtIndexPaths se si ottengono le celle visibili e si aggiornano direttamente (che evita qualsiasi animazione da accadendo). Vedi cellForRowAtIndexPath:.

+0

** Capisco i necessario. ** [[self.tableView reloadRowsAtIndexPaths: [self.tableView indexPathsForVisibleRows] withRowAnimation: UITableViewRowAnimationNone]; ' ** Ma questo dà un errore: ** 'NSInternalInconsistencyException', motivo: 'Aggiornamento non valido: numero non valido di righe nella sezione 0. – user3576169

+0

Come posso gestire questo errore, perchè non sto passando il no. di righe manualmente – user3576169

+0

Il numero di righe viene restituito nel metodo delegato. Se aggiorni 'CollectionQueryResult', devi chiamare' reloadRowsAtIndexPaths', 'insertRowsAtIndexPaths' e' deleteRowsAtIndexPaths' in base alla differenza tra il vecchio e il nuovo contenuto di 'CollectionQueryResult'. – Wain

3

Perché non si chiama semplicemente il metodo reloadSections anziché [self.tableView reloadData];

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; 
2

Consultare il metodo delegato cellForRowAtIndexPath. Potresti eseguire alcune operazioni che potrebbero causare un movimento rapido. Nel mio caso, stavo impostando un'immagine di una vista immagine con animazione. Quindi ogni volta che ricarico il tavolo, è stato tremolante a causa di quell'animazione.

Ho rimosso quell'animazione e ha funzionato per me ..

Problemi correlati