2015-06-03 12 views
6

Powiedzmy, że mam 3 kontrolery ViewController - A, B i C. A pokazuje B, B pokazuje C. Potem chcę wrócić do A bez przechodzenia (wizualnie) B (jak przycisk home). Mój problem polega obecnie na tym, że kiedy się rozwijam A, przez krótki czas wyświetlany jest B (wywoływane są metody viewWillAppear i inne). Jak mogę to rozwiązać?Rozwiń listę - cofnij wiele widoków

Uwaga1: Powyższy przykład jest bardzo uproszczony w porównaniu do mojego prawdziwego drzewa nawigacyjnego aplikacji i dla mnie użycie NavigationController jako kontenera dla wszystkich A, B i C nie jest możliwe (lub przynajmniej nie jest pożądane). Niewiele jest powodów, dla których w trakcie transformacji są złożone sekcje osadzone i różne niestandardowe przejścia (prawie wszystkie animowane przejścia są absolutnie różne) we wszystkich widokach.

Uwaga 2: Znalazłem pseudo rozwiązanie z definiowaniem niestandardowej segue i używanie go jako niestandardowej opcji Unwind. Nie jest to również pożądane, ponieważ chcę korzystać z moich już gotowych animatorów przejścia.

Każda pomoc jest bardzo ceniona.

Odpowiedz

1

Należy zauważyć, że jest to poprawiona odpowiedź - w odpowiedzi na pierwszy komentarz poniżej.

Mam możliwe rozwiązanie, które wydaje się działać. Ale może nie być właściwe. Nie jestem pewien i oferuję to tylko do rozważenia.

Trzy kontrolery widoku są skonfigurowane zgodnie z opisem w pytaniu (drugi jest czerwony, aby zauważyć, czy jest widoczny podczas odprężania).

enter image description here

Segue rozwijającej się w sterowaniu widok trzeciego (c), przez przeciągnięcie do wyjścia. Przed tym należy dodać wymagane akcje do pierwszego i drugiego kontrolera widoku.

enter image description here

enter image description here

Poniżej znajduje się kod dla 3 Widok kontrolerów. Moja poprawka - Używam globalnej wartości logicznej o nazwie unwindCheck jako flagi, która jest ustawiana przed usunięciem jako true, ale poza tym jest false. Jeśli jest to true, wówczas self.view.hidden = true w viewWillAppear dla drugiego kontrolera widoku. tj. ukryty podczas odprężenia.

Zwróć uwagę, że dodałem również drugi przycisk na trzecim kontrolerze widoku - wywołuje ten sam mechanizm rozwijania - właściwość identyfikatora jest ustawiona na "UnwindToFirstSegue". Drugi przycisk nie jest konieczną częścią tego możliwego rozwiązania.

class FirstViewController: UIViewController { 

    @IBAction func unwindToFirstViewController(segue: UIStoryboardSegue) { 
    } 

    override func viewDidLayoutSubviews() { 
     unwindCheck = false 
    } 
} 

class SecondViewController: UIViewController { 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     if unwindCheck == true { 
      self.view.hidden = true 
     } 
    } 

    @IBAction func unwindToSecondViewController(segue: UIStoryboardSegue) { 
    } 
} 

class ThirdViewController: UIViewController { 

    @IBAction func backToA(sender: AnyObject) { 
     performSegueWithIdentifier("UnwindToFirstSegue", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let identifier = segue.identifier{ 
      switch identifier { 
      case "UnwindToFirstSegue": 
       unwindCheck = true 
      default: 
       break 
      } 
     } 
    } 
} 

identyfikator odprężyć Segue można ustawić poprzez wybranie go w Zarysie dokumentu, a następnie przechodząc do inspektora Atrybuty.

+0

O ile widzę, przejście od C do A (którego typ znajduje się za B) nie jest odprężeniem (popraw mnie jeśli się mylę). Jeśli to, co zakładam, jest prawdą, to zacznie przeciekać ... no dokładnie nie przeciek, ale zużywa coraz więcej pamięci po cyklu A-> B-> C-> A-> B-> C-> A. .. liczba kopii A na przykład w pamięci po A-> B-> C-> A będzie wynosić 2, co jest złe dla aplikacji. Odsunięcie podczas odprężania polega na tym, że nie tworzy nowego kontrolera za każdym razem, gdy się z nim segregujesz i używasz już utworzonej kopii (nie jest to w 100% poprawne, ale dostajesz punkt). – devfreak

+0

Tak. Przepraszam.W odpowiedzi na Twój komentarz całkowicie zmieniłem swoją odpowiedź. – simons