我知道通常,当UIViewController A
呈现另一个UIViewController B
时,presentedViewController
的{{1}}属性设置为A
。所以B
保留在内存中。
简单地说,我希望A
提供A
,但随后B
会被清理,因为它永远不会被返回。
有关更完整的解释和基本原理,在我的应用程序中,我有一个UINavigationController,可能在层次结构中有一堆屏幕。在某些时候(例如使用注销),我想通过调用A
来呈现一个新的视图控制器(登录)。但是,应用程序无法通过调用" dismiss"来回到UINavigationController。来自登录控制器。如果执行登录,则登录视图控制器将“显示”#34;一个新的UINavigationController。
我希望原始的UINavigationController及其所有层次结构都得到清理,因为层次结构中可能有许多屏幕似乎永远不会再次使用。
(另外,在这种情况下,当用户启动应用程序时,他们是"自动登录",因此UINavigationController是根控制器。因此,当注销时,它可以' ; t"解雇"本身返回登录界面。)
谢谢!
答案 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只发送一个本地通知,告知导航控制器用户状态已更改并检查用户是否存在。
还要确保所有的视图控制器都已取消初始化,因此它们不会留在内存中。