在这种情况下我应该使用导航控制器吗?

Posted

技术标签:

【中文标题】在这种情况下我应该使用导航控制器吗?【英文标题】:Should I use a navigation controller in this scenario? 【发布时间】:2015-01-19 07:08:23 【问题描述】:

所以我正在构建一个简单的聊天应用程序。我将有一个登录屏幕,注册并稍后在 UITableViewController 上显示朋友列表。我不确定我应该为此使用 UINavigationController 还是只使用 UIViewControllers。下面是潜在设置的两张图片。:

和:

我只是想知道使用导航控制器通常是更好的做法吗?我也对弹出视图控制器时会发生什么感到有些困惑。 [self.navigationController popViewControllerAnimated:YES]; 是将视图控制器保留在内存中以便稍后再次访问还是每次都创建一个新的? [self dismissViewControllerAnimated:YES completion:nil] 的同样问题,这是破坏控制器还是将其存储以供以后使用?谢谢

【问题讨论】:

我很确定在这两种情况下视图控制器都会被销毁,并创建一个新的控制器。很容易检查。只需覆盖视图控制器的dealloc 方法并在其中放入NSLog(@"destroyed"); 【参考方案1】:

我会告诉你我对何时使用导航控制器的看法。

如果您的应用需要以分层方式(主/细节)呈现其内容,则使用UINavigationController 是很常见的。

如果您需要展示一些与展示内容不严格相关的内容,您可以在上面使用新的视图控制器来展示它。

关于内存,一旦您不保留对控制器的任何引用,无论是在移除(弹出/关闭)后呈现或推送的控制器,您就会失去对它们的任何引用,因此内存中没有空间使用

【讨论】:

谢谢你,这是完美的,只是想知道内存管理。我真的不喜欢导航控制器使用从左到右动画呈现视图控制器的方式,不会真正适合我正在构建的应用程序。会坚持使用 UIViewControllers 您可以随时更改导航控制器的动画方式以呈现新的 vie 控制器,但不是那么“标准”。所以我建议你看看 View Controllers containment 是如何工作的,这基本上就是 Navigation controller 所做的,这样你就可以为你的应用程序实现正确的演示模型 如果我要先创建一个从后退按钮到控制器的 push segue,那会是一团糟吗?没有调用dismissViewController方法是不是意味着控制器留在内存中?【参考方案2】:

我想你会坚持UINavigationViewController。只是因为登录和注册属于您的用户管理。从 UX 的角度来看,如果您要呈现的场景与当前场景无关,最好使用 Modal。因此,请根据您的情况选择UINavigationViewController

第二个问题与内存管理有关。这有点像引用计数。如果你有东西可以引用UIViewController,它的引用计数不会下降到零,这意味着系统不会清理它。所以,你仍然有办法得到。如果您只是简单地弹出或关闭它而不引用它。引用计数将变为零,系统将清除它。

【讨论】:

【参考方案3】:

注意:如果您只想显示不需要分层导航或导航栏的视图控制器,则不需要使用 UINavigationController。

但在这种情况下,我仍然建议使用 UINavigationController,因为您的用例(登录流)可以使用导航流完全解决。

在内存方面现在有所不同。在这个问题上随意使用它们中的任何一个。尽管这些观点的呈现方式有所不同。

【讨论】:

以上是关于在这种情况下我应该使用导航控制器吗?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该使用导航控制器?

在导航控制器中返回和前进后保持文本字段的内容可见

TableView 数据覆盖导航栏

segues 仅适用于导航控制器吗? [关闭]

在这种情况下我应该使用左连接吗?

为啥我无法编辑嵌入了导航控制器的导航栏?