2009-07-02 12 views
7

Czy istnieje sposób dla UIViewController (wewnątrz stosu nawigacji), aby wykryć, czy się pojawia, ponieważ wykonano drążenie lub drążenie?UIViewController: wykrywanie drążenia i drążenia w górę

W viewWillAppear, topViewController UINavigationController i visibleViewController są już ustawione na nowy ViewController, niestety.

+0

Ja też zmagałem się z tym. Miałem nadzieję, że utworzę klasę helpera i zrobię z niej "UINavigationControllerDelegate" mojego "stosu", a następnie przejrzę za pomocą "navigationController: willShowViewController:", ale są dwa problemy: 1) wydaje się być wywoływany nawet wtedy, gdy nie jest wciśnięty (na przykład tabulacja nad tym stosem - co wydaje się podejrzane) i 2) jest to nazywane PO TYM powiązanym widokiem kontroleraWillAppear, co powoduje problemy logiczne dla mnie, ponieważ muszę wiedzieć, czy jestem w tym samym stosie zanim pojawi się widok. Po prostu to wskazuję, ponieważ to podejście wydawało się eleganckie, ale było ślepe. –

Odpowiedz

0

Nie można spojrzeć na właściwość viewControllers w kontrolerze nawigacyjnym?

+1

Obawiam się, że nie. Bieżący kontroler widoku zawsze będzie ostatnim elementem w tablicy. Nie można wykryć, czy dzieje się tak z powodu samego pchnięcia, czy też innego kontrolera, który został wykryty. :( – Norman

5

Można podklasy UINavigationController i dodać właściwość didPushViewController. Następnie można zastąpić pushViewController i popViewController, aby poprawnie ustawić właściwość odpowiednio na wartość true lub false.

+0

Brzmi nieźle, po prostu pomyślałem, że był łatwiejszy sposób, który przeoczyłem. – Norman

1

Po prostu trzeba wiedzieć, jakie będą poprzednie i następne kontrolery widoku? A może musisz wiedzieć, czy kontroler podglądu został popped lub popchnął? Można zaimplementować następującą metodę, która jest wyznaczona przez UINavigationControllerDelegate:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

Jeśli jednak trzeba zrobić, aby wiedzieć, czy dany kontroler pogląd pojawił albo wciśnięty, wówczas sugestia Matt Bridges' jest droga.

2

Innym sposobem jest przechowywanie dowolnych kontrolerów widoku, które są przewiercane, jako lokalne zmienne klasy - następnie w viewWillAppear, wiesz, że zostałeś trafiony z powodu przewiercenia, jeśli jakakolwiek z zmiennych lokalnych klasy jest nadal ustawiona. Nawet znasz kontroler, z którego użytkownik powrócił, dzięki czemu możesz wykonywać inną logikę (np. Pobieranie zmienionych wartości z kontrolowanych widoków, które wykonałeś).

Nie zapomnij o zwolnieniu i usunięciu odniesień w viewWillAppear, aby system został zresetowany w celu ponownego prawidłowego rozpoznania.

Bardzo podoba mi się ten mechanizm, niż posiadanie kontrolerów drążących o widoku głównym jako delegata do wypychania zmian, ponieważ często pracują nad oddzielnymi małymi kawałkami danych i nie powinni wiedzieć o cały kontroler widoku głównego. Ułatwia to ich ponowne wykorzystanie, ponieważ mogą być wywoływane przez wiele różnych klas.

Powiązane problemy