2017-02-20 32 views
7

Próbuję odrzucić VC i przedstawić nowy VC. ale nie chcę już istnieć starego VC. Używam poniższego kodu, aby odrzucić bieżący VC i przedstawić nowy. ale w ten sposób istnieje przerwa między zwolnieniem a teraźniejszością. Nie chcę, aby użytkownik to zauważył. więc chcę najpierw przedstawić nowy VC, a następnie odrzucić poprzedni. Czy jest jakiś sposób to zrobić?odrzuć kontroler bieżącego widoku PO zaprezentowaniu nowego kontrolera widoku - swift

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let destinationController = self.storyboard?.instantiateViewController(withIdentifier: "login") as! Login 
let presentingVC = self.presentingViewController 
self.dismiss(animated: false, completion: {() -> Void in 
    presentingVC!.present(destinationController, animated: true, completion: nil) 
}) 
+0

Dlaczego po prostu nie nazwać tego po kolei, najpierw prezent, a następnie odrzucić (a nie w zakończeniu obsługi obecnie)? A więc: 'prezentująceVC! .present (destinationController, animated: true, completion: nil); self.dismiss (animowane: fałsz, zakończenie: nil) ' –

+0

Przyjaciel dlaczego zwalniasz ten prądVc ze stosu? –

+0

bezpośrednio możesz odrzucić, kiedy chcesz, przez uczynienie animacji fałszywym. –

Odpowiedz

2

Myślę, że najlepszym sposobem będzie odejście od obecnego VC po powrocie. Oznacza to, przedstawić swoje destinationController użyciu bieżącego VC a kiedy wrócisz, odrzucenie zarówno VC

+0

Myślę, że byłby to lepszy pomysł, dzięki za pomoc. –

5

Zastrzeżone

Więc jeśli koniecznie musisz modally zaprezentować swój nowy VC, to polecam po prostu wykonując segue między dwoma VC. Wygląda na to, że prezentujesz go tylko modalnie, ponieważ chcesz ręcznie usunąć go później z oryginalnego VC. W mojej opinii nie tylko jest to łatwiejsze, ale pozwala również na użycie metody, którą opisałem poniżej.

Rozwiązanie

To prawdopodobnie nie jest najbardziej elegancki sposób, ale można przekazać instancję starym VC poprzez prepareForSegue do następnego VC, a następnie odwołać go w nowy VC viewDidLoad.

Na przykład, w swoim nowym VC można mieć coś takiego:

class NewVC: UIViewController { 

    ... 
    var prevVC: PrevVC! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     prevVC.dismiss(animated: false, completion: nil) 
    } 

} 

Więc, gdy ładunki newVC, że odwołuje poprzedni VC. Wszystko, co musisz zrobić w swojej klasie prevVC, to przekazać instancję w prepareForSegue, tak jak.

class PrevVC: UIViewController { 
    ... 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destinationVC = segue.destination as? NewVC { 

      destinationVC.prevVC = self 

     } 
    } 

} 

Oczywiście musisz po prostu przedstawić nową wersję, kiedy chcesz, a wtedy wszystko inne zostanie załatwione.

+0

Wygląda na to, że przedstawia VC w sposób modalny, więc nie odrzuciłbym wezwania do prezentacji VC również odrzucił prezentowany VC? – JohnnyAW

+0

@JohnnyAW Ah Widzę tutaj dylemat. Nie widziałem tego. Na szczęście wygląda na to, że prezentuje się tylko modalnie, aby mógł je później usunąć ręcznie. Tak więc, jeśli po prostu przeprowadził segue, wtedy nie powinno być problemu. Będę edytować mój post, aby zawrzeć te informacje. –