2010-09-19 20 views
53

Mam najwyższy poziom UIViewController, który zawiera UITableView. Najwyższy poziom UIViewController tworzy wystąpienia i przekazuje kolejne UIViewController do . TO ZNACZY. popieramy nowy, drugi pogląd. Ten drugi widok ma zwykle przycisk "Wstecz" w lewym górnym rogu, aby umożliwić powrót do widoku najwyższego poziomu.Załaduj ponownie UITableView podczas nawigacji z powrotem?

Czy możliwe jest, po przejściu do widoku najwyższego poziomu z drugiego widoku, przerysowanie UITableView w widoku najwyższego poziomu, przy użyciu danych generowanych w drugim widoku, przez wywołanie cellForRowAtIndexPath na najwyższym poziomie, a jeśli tak, jak to zrobić?

Odpowiedz

105

Wszystko, co musisz zrobić, to to (w twoim UIViewController, który ma UITableView). Nie musisz się martwić, co dzieje się na poziomie komórki w tym momencie.

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.tableView reloadData]; // to reload selected cell 
} 

Po prostu dodaj powyższy kod do kontrolera, a zobaczysz, że właściwa rzecz ma miejsce po powrocie z drugiego widoku. Wywołanie reloadData informuje widok tabeli, że musi odświeżyć komórki z modelu, a wszystko inne ładnie się podąża.

+1

użyłem tej metody, ale musiał przenieść kod z moim didViewLoad do viewWillAppear jak oni gdzie zarówno strzelania na wstępnym obciążeniem. Dla mnie był to większy problem, ponieważ muszę pobrać nowe szczegóły przedmiotu z serwisu WWW. – PowerMan2015

5

Można zaimplementować metody UINavigationControllerDelegate i utworzyć logikę do odświeżania po wyświetleniu kontrolerów widoku.

Innym sposobem wykonania tej czynności jest implementacja w sterowniku widoku tabeli pewnej logiki pod numerem viewWillAppear, w celu odświeżenia w oparciu o dane kontrolera wyświetlanego widoku.

Jeśli chcesz wysłać dane z drugiego kontrolera widoku do pierwszego kontrolera widoku, pamiętaj, że drugi kontroler widoku "nie" wie o istnieniu poprzedniego kontrolera widoku. Powinien być przejrzysty. Należy zaimplementować pewien protokół, aby drugi kontroler widoku wysyłał dane do pierwszego kontrolera widoku. To byłaby trzecia opcja tego problemu, ponieważ pierwszym kontrolerem widoku byłby delegat, a drugi kontroler widoku wysyłałby informacje do delegata, możesz przygotować widok tabeli (pierwszy kontroler widoku), aby przeładować, w oparciu o otrzymane dane.

10

Jeśli chcesz tylko odświeżyć komórki, który został wybrany, zastępują viewWillAppear: w niestandardowej podklasy UITableViewController tak:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; 
    [super viewWillAppear:animated]; // clears selection 
    if (selectedRowIndexPath) { 
     [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    } 
} 

UWAGA: Zakładając, że lewy clearsSelectionOnViewWillAppear zestaw do YES (domyślnie), musisz uzyskać ścieżkę indeksu wybranego wiersza przed wywołaniem super, która wyczyści zaznaczenie.

Ponadto, solution of @ZoranSimic, aby po prostu zadzwonić pod numer [self.tablView reloadData] jest akceptowalny, ponieważ jest mniej kodu i nadal jest wydajny.

Wreszcie, najlepszym sposobem zachowania synchronizacji komórek widoku tabeli z obiektami modelu, które reprezentują, jest wykonanie funkcji NSFetchedResultsController i użycie obserwacji wartości klucz-wartość (KVO) i/lub NSNotification w celu poinformowania kontrolera widoku tabeli o modelu obiekty zostały zmienione, aby można było ponownie załadować odpowiednie komórki. Kontroler widoku tabeli mógł zacząć obserwować zmiany w obiektach modelu w viewDidLoad i zakończyć obserwację w dealloc (i gdziekolwiek jesteś manually unload self.view).

6

Oprócz answer of Zoran Simic tutaj kod Swift:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 
+0

Uważaj, aby nie pobierać danych z 'viewDidLoad()', gdy chcesz ponownie załadować dane z 'viewWillAppear()'. –

1

Być może teraz pomóc.

Dla Swift 2+

W swojej metodzie viewDidAppear:

Jeśli chcesz odświeżyć całą tabelę:

tableView.reloadData() 

Jeśli chcesz odświeżyć tylko wybrane komórki.

let index = tableView.indexPathForSelectedRow 
if (index != nil){ 
    self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic) 
} 
2

viewWillAppear jest wywoływana za każdym razem, gdy widok pojawia się po raz pierwszy. Oto moje rozwiązanie dla odświeżyć widok tylko podczas nawigowania wstecz

tworzę jedną zmienną w .h file z moich ViewController dla sprawdzenia, że ​​jest to pierwszy raz, kiedy pojadę do tego ViewController lub kiedy nawigować wstecz

@property (nonatomic) BOOL isViewExist; 

Potem w viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    if(!self.isViewExist){ 
     self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything 
    }else{ 
     [self.tableView reloadData]; // to reload the tableview data 
     // or your can refresh anything in your ViewController as you want 
    } 
} 

nadzieję, że ta pomoc

-1

Aktualizacja dla Swift 3

let index = tableView.indexPathForSelectedRow 
    if (index != nil){ 
     self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic) 
    } 
+0

_in - przesłonięcie func viewDidLoad() lub ??? _ - komentowanie w imieniu użytkownika, który nie może komentować – Tushar

Powiązane problemy