ViewControllers没有破坏

gal*_*gal 8 memory hierarchy ios swift

我的iOS应用程序存在严重问题.

我的应用程序中有登录逻辑.登录然后注销时,某些视图控制器不会破坏.这会导致一些问题,例如,我发出的一些事件会NSNotifcationCenter被发射几次.这些问题是可以避免的,但我真的想要一个解决方案,以避免一些视图控制器在后台保持打开状态而不控制它.

控制登录逻辑的方式如下:

在app delegate start函数中,如果用户已经登录,我将根视图控制器设置为主可用视图控制器.因此,我没有做任何事情,并且根视图控制器通过故事板设置为登录视图控制器导航控制器.

当用户注销时,我使用模态segue将视图控制器转换回登录视图控制器导航控制器.

你可能已经理解我正在使用故事板,swift和最新的iOS.

我的注销代码是segue,它带我到LoginViewControler:

self.performSegueWithIdentifier("Logout", sender: self)
Run Code Online (Sandbox Code Playgroud)

我的app代理代码:

if (userDefaults.valueForKey("uid") != nil) {
    let tabBarView = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("TabBarViewController") as! TabBarViewController
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window?.rootViewController = tabBarView        
 }
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我很感激帮助:)

编辑

我甚至尝试在注销操作中设置根视图控制器,这也没有帮助.怎么可能呢?

这就是我现在注销的方式:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let newRootViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginNavigationController") as! UINavigationController          

appDelegate.window!.rootViewController = newRootViewController
Run Code Online (Sandbox Code Playgroud)

Ada*_* H. 1

如果登录屏幕显示登录屏幕,并且登录屏幕显示登录屏幕,那么您将有一个不断堆积新视图控制器的循环。为了解决这个问题,一个人不能呈现对方,而是放松地对待它。另一种可能性是将每个实例作为单例保存并仅呈现这些实例。

  • 要点是您不应该添加视图控制器来返回到上一个屏幕。如果您不使用导航控制器,请调用“dismissViewController”。 (3认同)