【问题标题】:Objective-C : Modal Segues and Releasing View ControllerObjective-C:模态转场和释放视图控制器
【发布时间】:2015-10-08 20:09:42
【问题描述】:

我的应用程序上的初始视图控制器是一个 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)。

有人可以在这里解释我的逻辑错误吗?

【问题讨论】:

  • userLoginToMainSeg 是个什么样的segue?
  • @TamásZahola 这是一个模态序列

标签: ios objective-c segue


【解决方案1】:

你的模态转场基本上是在做:

[loginViewController presentViewController:mainViewController animated:YES completion: ...];

这意味着mainViewController变成loginViewControllers presentedViewController

loginViewController.presentedViewController == mainViewController
mainViewController.presentingViewController == loginViewController

当您是presenting a view controller 时,呈现视图控制器仍保留在视图控制器层次结构中,以便您稍后可以通过调用返回:

[loginViewController dismissViewControllerAnimated: ...];

所以loginViewController 没有被释放是完全正常的,因为它仍然是窗口的rootViewController。只是loginViewController 被呈现的mainViewController 挡住了。

如果您想消除loginViewController,您可以直接设置window.rootViewController,但这不会为过渡设置动画。你可以实现动画by messing around the view controllers' views,但这有点超出官方认可的领域......

IMO 最干净的解决方案是实现一个基本的container view controller,这将是您窗口的rootViewController,并且可以通过为他们的视图设置动画,然后丢弃@987654339 来协调loginViewControllermainViewController 之间的转换@。这将是一种没有导航栏和导航堆栈的原始导航控制器——只需将当前视图控制器与新视图控制器交换,并丢弃前者。

【讨论】:

  • 感谢您的回答。在我展示 tabbarcontroller 后,有没有办法释放 loginviewcontroller?将 tabbarcontroller 设置为 rootviewcontroller 可以解决问题吗?
  • 它会做,但不会动画。我已经用一些可能的解决方案更新了答案。
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多