我的应用程序上的初始视图控制器是为登录用户显示的UITabBarController。
但是,对于新用户,我的应用代理会首先将他们指向登录/注册视图控制器:
// New user, show login
self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
当用户完成登录/注册后,我会将用户发送到标签栏:
// Login done, go to main view
[self performSegueWithIdentifier:@"userLoginToMainSeg" sender:self];
然而,这样做,LoginViewController没有被释放(dealloc没有被调用)。
有人可以在我的逻辑中解释错误吗?
答案 0 :(得分:0)
你的模态segue基本上是这样做的:
[[],{"user_id":"77","crtloc_lat":"34.769638","crtloc_lng":"72.361145"},{"user_id":"76","crtloc_lat":"34.769566","crtloc_lng":"72.361031"},{"user_id":"87","crtloc_lat":"33.697117","crtloc_lng":"72.976631"},{"user_id":"86","crtloc_lat":"33.697117","crtloc_lng":"72.976631"}]
这意味着[loginViewController presentViewController:mainViewController animated:YES completion: ...];
成为mainViewController
s loginViewController
:
presentedViewController
当您为presenting a view controller时,呈现视图控制器仍保留在视图控制器层次结构中,以便您稍后可以通过调用导航回来:
loginViewController.presentedViewController == mainViewController
mainViewController.presentingViewController == loginViewController
因此[loginViewController dismissViewControllerAnimated: ...];
未被释放是完全正常的,因为它仍然是窗口的loginViewController
。只有rootViewController
被提交的loginViewController
阻挡。
如果您要根除mainViewController
,可以直接设置loginViewController
,但这不会为转换设置动画。你可以实现动画by messing around the view controllers' views,但它在官方认可的领域之外......
IMO最干净的解决方案是实现一个基本container view controller,它将成为您的窗口window.rootViewController
,并且可以通过设置动画来协调rootViewController
和loginViewController
之间的转换观看,然后扔掉mainViewController
。它将是一种原始的导航控制器,没有导航栏和导航堆栈 - 只需用新的控制器交换当前的视图控制器,然后扔掉前者。