2016-11-14 24 views
0

的擺脫我知道,通常情況下,當一個UIViewController A呈現出另一種的UIViewController BApresentedViewController屬性設置爲B。所以A保留在內存中。如何調用UIViewController.present(是presentViewController)和presentingViewController

簡單地說,我想A到目前B,但然後有A得到清理,因爲它永遠不會返回。

有關更完整的解釋和理由,在我的應用程序中,我有一個UINavigationController,它可能在層次結構中有一堆屏幕。在某些時候(例如使用註銷),我想通過調用self.present(loginViewController, animated: true, completion: nil)來呈現一個新的視圖控制器(登錄)。但是,通過從登錄控制器調用「解除」,應用程序不會再回到UINavigationController。如果執行登錄,登錄視圖控制器將「呈現」一個新的UINavigationController。

我想要原始的UINavigationController及其所有層次結構得到清理,因爲層次結構中可能有許多屏幕,看起來將永遠不會再次使用。 (此外,在這種情況下,當用戶啓動應用程序時,它們是「自動登錄」的,因此UINavigationController是根控制器。因此,在註銷時,它不能「解除」自身回到登錄屏幕。)

謝謝!

回答

1

您不能使呈現視圖控制器從呈現的視圖控制器後面消失。但是...

第一點:視圖控制器相當輕量級,所以從不回到呈現視圖控制器真的沒什麼問題。第二點:如果問題是您希望應用啓動根據用戶的登錄狀態有所不同(即使用不同的根視圖控制器),那麼需要照顧的地方在您的執行application:didFinishLaunchingWithOptions:。第三點:如果這確實是一個問題,那麼也許你需要重新考慮你的整個架構。也許你不要想要一個呈現的視圖控制器在所有,而是一個視圖控制器是代替爲第一個視圖控制器。有很多方法來安排。

+0

第一點:它更多的是我有一個UINavigationController,它可能有一對夫婦在它的層次結構中的幾十個屏幕。我想擺脫所有這些(但就你而言,也許這並不重要)。 – SuperDuperTango

+0

第二點:不,啓動方式不同於我所尋找的。 – SuperDuperTango

+0

我認爲你的第三點是我要找的。我不知道如何替代視圖控制器。時間更多的搜索/ SOing ... :) – SuperDuperTango

0

這個問題是類似的問題enter link description here

爲方便起見,我加上我的回答如下。

UIView.transition(from: currentRootViewController!.view, to: vc.view, duration: 0.8, options: .transitionCrossDissolve, completion: { (_) in 
     (UIApplication.shared.delegate as! AppDelegate).window?.rootViewController = vc 
}) 
0

據我瞭解:

你可以用類似的代碼實現這

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let vc = storyboard.instantiateViewController(withIdentifier: <Identifier as in Storyboard of B>) 
(UIApplication.shared.delegate as! AppDelegate).window?.rootViewController = vc 

如果你想有一個過渡,你可以用的東西,如下替換最後一行您有一個根UINavigationController,您可以在其中呈現不同的視圖控制器,無論該應用是否有用戶登錄。如果是這樣的話:

if (user != nil){ 
myNavigationController.setViewControllers([*/Initialize your first ViewController*/]) 
}else { 
myNavigationController.setViewControllers([*/Initialize your LoginViewController/]) 
} 

如果用戶logsOut/logsIn只需發送一個本地通知,告訴用戶狀態發生變化,並檢查用戶是否存在導航控制器。

還要確保所有視圖控制器正在被取消初始化,以便它們不會留在內存中。

相關問題