2017-11-25 33 views
1

在應用程序的開始,我有一個登錄界面,這是LoginViewController和成功的實例,即在我的用戶成功登錄,正在使用顯示我的應用程序的主要內容將performSegue(withIdentifier identifier: String, sender: Any?)方法應用於UITabBarController的實例。遺憾的是,我在LoginViewController之後沒有撥打deinit()。這不會發生,因爲我可能在我的LoginViewController中有任何參考週期,因爲我明確檢查了這些。確保登錄視圖控制器被釋放

由於只有在應用程序啓動時才需要登錄屏幕,我想知道是否有最佳做法能夠確保我的LoginViewController在segue之後被釋放?

也許使用賽格瑞只是不實現這一目標的正確方法,因爲 據我所知,類似的問題Deinit not called on Show Detail segue的結論是這樣的事實,即使用showDetail-SEGUE是一樣的使用模式介紹,即兩個控制器保持彼此的引用,並且不會在其中任何一箇中調用deinit()。這是真正的令人欽佩的行爲,還是我錯過了什麼?

更新:我顧不了那麼多的原因,是事實,我使用RxSwift和我LoginViewController訂閱幾個Observables,所以我的應用程序離開LoginViewController後,我要確保設定我收集DisposeBag爲零。在我的LoginViewControllerViewDidDisappear()中做這個嗎?

+1

你可以用全成登錄後更換您的RootViewController的嘗試:(?UIApplication.shared.delegate爲AppDelegate中)? .window?.rootViewController = yourTabBarController –

+0

謝謝,但不幸的是,這並沒有改變任何東西。從ViewController(不是rootViewController)使用segue時會發生同樣的問題。 – Alienbash

+1

你無法解除分配登錄屏幕的原因是因爲你的標籤欄可以被解僱(你可能不希望它發生,但API在那裏)。這裏沒有什麼可以做,在這裏,除了某種容器視圖控制器是與交換的標籤之一,或重寫根登錄控制器的建議 –

回答

0

我會建議你創建一個自定義賽格瑞類和重寫這樣的執行功能:

class CustomSegue: UIStoryboardSegue { 
    override func perform() { 
     source.view.window?.rootViewController = destination 
    } 
} 
相關問題