2017-02-20 77 views
7

我試圖解僱一個VC並提出一個新的VC。但我不希望舊的VC再存在。我使用下面的代碼來解散當前的VC並呈現新的。但這樣,解僱與現在之間有一段時間間隔。我不希望用戶注意到這一點。所以,我想先介紹一下新的VC,然後解散前一個。有沒有辦法做到這一點?解僱目前的視圖控制器後提出新的視圖控制器 - 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

爲什麼不按順序,先出現然後解僱(而不是現在的完成處理程序)呢?所以: 'presentVC!.present(destinationController,animated:true,completion:nil); self.dismiss(animated:false,completion:nil)' –

+0

朋友你爲什麼要從堆棧中解散currentVc? –

+0

直接可以通過使動畫爲假來解僱您。 –

回答

2

我認爲最好的辦法是在實際回去時關閉當前的VC。這意味着,出示您的destinationController使用當前的VC,然後當你回去,認爲這兩個VC的

+0

我認爲這將是一個更好的主意,感謝您的幫助。 –

5

免責聲明

所以,除非你絕對需要模態地呈現新的VC,那麼我建議只是執行SEGUE兩個VC之間。看起來你只是以模態方式呈現它,因爲你想在以後從原始VC手動解除它。在我看來,不僅使用segue更容易,而且它還允許您使用下面概述的方法。

解決方案

這可能不是最巧妙的方法,但你可以通過prepareForSegue通過老VC的情況下一個VC,然後在新的VC的viewDidLoad駁回。

例如,在新的VC,你可以有這樣的事情:

class NewVC: UIViewController { 

    ... 
    var prevVC: PrevVC! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

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

} 

所以,當你的NEWVC負載,它否定了以前的VC。您需要在prevVC類中執行的操作就是像prepareForSegue那樣傳遞實例。

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

      destinationVC.prevVC = self 

     } 
    } 

} 

那麼當然,你只需要提出新的VC,當你想要的,然後一切都會照顧。

+0

它看起來像是以模態的方式呈現VC的,所以不會在提交的VC上解僱所提交的VC以及解僱? – JohnnyAW

+0

@JohnnyAW我看到這裏的困境。沒有看到。幸運的是,他似乎只是模態地呈現,以便以後可以手動解散它。因此,如果他只是執行一個賽格,那麼就不應該有問題。我將編輯我的帖子以包含此信息。 –

相關問題