2014-04-26 11 views
5

Problem polega na tym, że pojawia się interfejs użytkownika, a następnie jest on aktualizowany: powoduje migotanie.[self.tableview reloadData]; powoduje migotanie

Chcę, aby interfejs był aktualizowany tylko raz, gdy użytkownik wchodzi do aplikacji, w ten sposób załadowałem ponownie w ViewDidLoad. Oto kod. Każda pomoc, jak można usunąć to migotanie ... Jakiś przykład kodu mógłby pomóc.

- (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

jaki jest twój problem, proszę rozwinąć swoje pytanie. – iPatel

+0

Problem polega na tym, że pojawia się interfejs użytkownika, a następnie jest on aktualizowany: powoduje migotanie. – user3576169

+0

Wymagam, aby komórki były aktualizowane bez pełnego migotania TableView. Odniosłem się do tego http://stackoverflow.com/questions/11631104/uitableview-reloaddata-how-to-stop-flicker, ale nie pomogło – user3576169

Odpowiedz

1

nadzieję, że poniższe linie mogą pomóc w opóźnieniu i migotanie problemy

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

}); 
+0

nadal migać .. – user3576169

+0

faktycznie tableview tylko przeładuj widoczne komórki domyślnie –

+1

** Rozumiem, że muszę to zrobić. ** '[self.tableView reloadRowsAtIndexPaths: [self.tableView indexPathsForVisibleRows] withRowAnimation: UITableViewRowAnimationNone];' ** Ale to daje błąd: ** 'NSInternalInconsistencyException', powód: 'Błędna aktualizacja: nieprawidłowa liczba wierszy w sekcji 0. – user3576169

1

Pobieranie jest asynchroniczne, więc nie będzie zakończyć przed widok jest pokazany. Tak więc, cokolwiek masz w CollectionQueryResult zostanie wyświetlone.

Można było albo:

  1. Wyczyść CollectionQueryResult więc tabela nie jest wypełniana aż dostaniesz aktualizacji
  2. Porównaj CollectionQueryResult i objects, a następnie zaktualizować tylko widoczne komórki w których dane uległy zmianie (przed ustawieniem CollectionQueryResult)

Zauważ, że dla opcji 2 będzie trzeba także porównać liczbę CollectionQueryResult i objects a następnie włóż/usuń r z widoku tabeli odpowiednio. Cały punkt opcji 2 to nie dzwonić pod numer reloadData, więc musisz wykonać znacznie więcej pracy ...

Możesz również uniknąć dzwonienia pod numer reloadRowsAtIndexPaths, jeśli otrzymasz widoczne komórki i zaktualizujesz je bezpośrednio (dzięki czemu unikniesz animacji z wydarzenie). Zobacz cellForRowAtIndexPath:.

+0

** Rozumiem, że trzeba to zrobić. ** '[self.tableView reloadRowsAtIndexPaths: [self.tableView indexPathsForVisibleRows] withRowAnimation: UITableViewRowAnimationNone];' ** Ale to daje błąd: ** 'NSInternalInconsistencyException', powód: 'Nieprawidłowa aktualizacja: nieprawidłowa liczba wiersze w sekcji 0. – user3576169

+0

Jak radzić sobie z tym błędem, bo nie przekazuję nie. wierszy ręcznie – user3576169

+0

Liczba wierszy jest zwracana w metodzie delegatów. Jeśli aktualizujesz 'CollectionQueryResult', musisz wywołać' reloadRowsAtIndexPaths', 'insertRowsAtIndexPaths' oraz' deleteRowsAtIndexPaths' na podstawie różnicy między starą i nową zawartością 'CollectionQueryResult' – Wain

3

Dlaczego po prostu nie wywołasz metody reloadSections zamiast [self.tableView reloadData];

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

Skorzystaj z metody delegatów na stronie cellForRowAtIndexPath. Możliwe, że wykonujesz operację, która może spowodować poruszenie. W moim przypadku ustawiałem obraz widoku obrazu z animacją. Więc za każdym razem, gdy ponownie ładuję tabelę, migotało z powodu tej animacji.

Usunąłem tę animację i pracowałem dla mnie ..

Powiązane problemy