如何调用UIViewController.present(presentViewController)并摆脱presentationViewController

时间:2016-11-14 18:34:43

标签: ios swift uiviewcontroller uinavigationcontroller

我知道通常,当UIViewController A呈现另一个UIViewController B时,presentedViewController的{​​{1}}属性设置为A。所以B保留在内存中。

简单地说,我希望A提供A,但随后B会被清理,因为它永远不会被返回。

有关更完整的解释和基本原理,在我的应用程序中,我有一个UINavigationController,可能在层次结构中有一堆屏幕。在某些时候(例如使用注销),我想通过调用A来呈现一个新的视图控制器(登录)。但是,应用程序无法通过调用" dismiss"来回到UINavigationController。来自登录控制器。如果执行登录,则登录视图控制器将“显示”#34;一个新的UINavigationController。

我希望原始的UINavigationController及其所有层次结构都得到清理,因为层次结构中可能有许多屏幕似乎永远不会再次使用。

(另外,在这种情况下,当用户启动应用程序时,他们是"自动登录",因此UINavigationController是根控制器。因此,当注销时,它可以' ; t"解雇"本身返回登录界面。)

谢谢!

3 个答案:

答案 0 :(得分:1)

您无法使呈现视图控制器从呈现的视图控制器后面消失。但...

第一点:视图控制器相当轻量级,因此永远不会回到呈现视图控制器没有错。

第二点:如果问题是您希望应用程序以不同的方式启动(即使用不同的根视图控制器),具体取决于用户的登录状态,那么该地点在application:didFinishLaunchingWithOptions:

的实施中,要注意这一点

第三点:如果这确实是一个问题,那么您可能需要重新考虑整个架构。也许你根本不想要一个呈现的视图控制器,而是为第一个视图控制器替换的视图控制器。有很多方法可以安排。

答案 1 :(得分:0)

此问题类似于问题enter link description here

为方便起见,我在下面添加了答案。

您可以使用与

类似的代码实现此目的
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

如果您想要包含转换,可以使用以下内容替换最后一行:

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

答案 2 :(得分:0)

据我所知,您有一个根matrix,您可以在其中显示不同的视图控制器,无论该应用是否有用户登录。如果是这样的话:

UINavigationController

如果用户logsOut / logsIn只发送一个本地通知,告知导航控制器用户状态已更改并检查用户是否存在。

还要确保所有的视图控制器都已取消初始化,因此它们不会留在内存中。