我的iOS应用程序存在严重问题.
我的应用程序中有登录逻辑.登录然后注销时,某些视图控制器不会破坏.这会导致一些问题,例如,我使用NSNotifcationCenter发出的一些事件会被发出几次.这些问题是可以避免的,但我真的想要一个解决方案,以避免一些视图控制器在后台保持打开状态而不控制它.
控制登录逻辑的方式如下:
在app delegate start函数中,如果用户已经登录,我将根视图控制器设置为主可用视图控制器.因此,我没有做任何事情,根视图控制器通过故事板设置为登录视图控制器导航控制器.
当用户注销时,我使用模态segue将视图控制器转换回登录视图控制器导航控制器.
你可能已经理解我正在使用故事板,swift和最新的iOS.
我的注销代码是segue,它带我到LoginViewControler:
self.performSegueWithIdentifier("logout",sender: self)
我的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 }
我究竟做错了什么?
我很感激帮助:)
编辑
我甚至尝试在注销操作中设置根视图控制器,这也没有帮助.怎么可能呢?
这就是我现在注销的方式:
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate let newRootViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginNavigationController") as! UINavigationController appDelegate.window!.rootViewController = newRootViewController
解决方法
亚当H.是对的.如果这不起作用,那么检查具有强关系的IBOutlets和委托,并将它们更改为弱关系.即
@IBOutlet weak var collectionView: UICollectionView!
如果没有weak关键字,视图控制器将永远不会被处理掉.
根据项目的设置方式,如果您每次有人注销时使用导航控制器(我推荐),您都可以使用
dispatch_async(dispatch_get_main_queue()) { self.navigationController.popToRootViewControllerAnimated(true) }
这将弹出导航堆栈中的所有内容,它将处理所有视图控制器(除非你有很强的关系,否则它们不会被丢弃)