15

Załóżmy, że mam 2 UIViewControllers na stosie w ramach UINavigationController. W "rodzic" nazywamy "[self.navigationController pushViewController: childViewController animated: YES];" w przypadku niektórych działań użytkownika i "dziecka" nazywamy "[self.navigationController popViewControllerAnimated: YES];" w przypadku niektórych działań użytkownika.iOS: Jak rozpoznać, że wróciliśmy z obiektu UIViewController w kontrolerze nadrzędnym UIViewController?

Jak rozpoznać w rodzica, że ​​właśnie wróciliśmy?

Czy istnieje metoda "zdarzenia", która może rozpoznać, że ta akcja popViewControllerAnimated została wywołana z potomka?

Odpowiedz

0

Najpierw przeczytaj this, to pomoże ci zrozumieć, co dzieje się z kontrolerami widoku.

Następnie zaimplementuj viewWillAppear: i viewDidAppear: w kontrolerze widoku rodzica, aby zarejestrować komunikat.

+1

To nie oznacza jednak, który sterownik został wysunięty. Może istnieć kilka różnych. Ale oczywiście nie w stanie pchniętym, więc OP może po prostu śledzić, który kontroler został ostatnio zepchnięty. –

1

Jest na to kilka wskazówek. Co możesz zrobić, to wywołać popViewControllerAnimated z rodzica. Możesz to zrobić, przekazując block do kontrolera podrzędnego, który następnie wykona wspomniany blok, a tym samym popping zostanie wykonany przez kontroler nadrzędny.

Można również użyć delegata UINavigationController aby otrzymywać powiadomienia o UIViewController zostanie odrzucony:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; 

Ta metoda pozwoli Ci wiedzieć, które zostaną pokazane VC i można sprawdzić, czy obecny (jeszcze Popped) VC jest dzieckiem, którego szukałeś.

Możesz też zrobić sztuczkę z - (void) viewWillAppear: ale może to wymagać pewnych hacków.

6

Wygląda na to, że używasz tego kontrolera dziecięcego jako modalu, ponieważ można go "zwolnić". W takim przypadku spróbuj zastosować wzorce Apple, których używają do UIAlertViews.

Jeśli tak jest, chciałbym wykonać jedną z poniższych czynności, aby wprowadzić wzorzec delegata (delegat kontra blok to wielka debata, której nie będę tu wprowadzać), więc właściciel (ten, który popycha dziecko) wie, kiedy jego oddalił:

  • Tworzenie protokół (ChildControllerDelegate), mają jeden sposób w nim childControllerWasDismissed: (ChildController *)
  • dodać obiekt bloku (upewnij się, że jego właściwość kopiowania, nie zachowują) do ChildController

Będziesz hen chce wywołać metodę delegata lub blok na viewDidDisappear. Jeśli chcesz dokładniej kontrolować ziarno, użyj metody delegowania lub bloku, który odpowiada viewWillDisappear/viewDidDisappear.

3

Z powodzeniem rozwiązałem to, ustawiając navigationController?.delegate = self, a następnie wdrażając tę ​​metodę, aby ustalić, czy bieżący kontroler widoku jest ponownie wyświetlany po pop.

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      // we got back 
     } else { 
      // some other controller was pushed 
     } 
    }