从任何其他视图控制器移动到任何几个视图控制器

Posted

技术标签:

【中文标题】从任何其他视图控制器移动到任何几个视图控制器【英文标题】:Moving to any of several view controllers from any of the others 【发布时间】:2014-03-23 00:33:57 【问题描述】:

我正在开发的应用程序有五个视图控制器。

让我们称它们为 A、B、C、D 和 E,并以 A 作为根视图控制器。

A 将有四个按钮来导航到其他每个视图控制器。同样,B、C、D 和 E 将有四个按钮,每个按钮用于导航到所有其他视图控制器。

使用presentViewController: 来实现导航是个好主意吗,因为在视图控制器的关系中没有明确的层次结构?我认为我没有清楚地理解展示者与展示者的关系。

被呈现的视图控制器是否必须由呈现者处理?

假设 A 介绍 B,B 然后介绍 C,C 然后介绍 A。是否有任何控制器被释放/解雇?谁在处理谁的解雇?当A终于出现时,B还在记忆中吗?

我想到的另一种方法是设计和编写一个视图控制器容器并管理所有视图控制器。我读过这不是一个容易走的领域。

以下哪个更有意义?

【问题讨论】:

听起来你应该使用标签栏控制器。 Apple 已经在 Cocoa Touch 中提供了几个容器视图控制器。 @JoshCaswell 我绝对不想显示标签栏,也想在屏幕上的不同位置放置按钮。我确信 UITabController 可以定制。我会调查的。 【参考方案1】:

您可以使用 UINavigationController 将新控制器推送到堆栈。如果您不希望用户返回(这意味着不将旧视图控制器保留在堆栈中),您可以简单地将新分配的视图控制器设置为根 vc:

-(void)buttonAPressed:(UIButton *)button 
    AViewController *vc = [[AViewController alloc] init];
    self.view.window.rootViewController = vc;

【讨论】:

这似乎是一个可行的解决方案,只是每次我们导航到控制器时,它都会被分配,一旦我们完成它就可能会被释放。我来自 C++ 背景,我不确定这么多分配是否是个好主意。还有过渡风格呢?设置根视图控制器是否允许我们指定视图转换样式? @Ravi 你可以看看这个关于过渡动画的问题:***.com/questions/8146253/… @Ravi 也当您将新控制器分配给 rootViewController 时,如果旧控制器没有从单例类、应用程序委托或其他地方引用为强控制器,则旧控制器将被释放。 谢谢奥马尔。我最终编写了自己的容器视图控制器。鉴于我的应用程序中视图控制器的数量非常少,我认为可以在需要或不需要时分配/取消分配视图控制器。我猜 ARC 正在解决这个问题。【参考方案2】:

如果您的情况是您有 5 个视图控制器实例并且您使用相同的实例,则必须使用容器解决方案。如果你使用相同的实例,你每次只分配这 5 个,所以你没有问题。

如果相反,您需要使用新实例深入导航,并且在返回后(如导航控制器),最好的解决方案是在每次新视图控制器时以及当您返回时实例化上一个,最后一个被解雇。

注意如果您需要深入打开许多实例但可能没有返回(如导航控制器),则需要使用第一个解决方案,因为您必须为每个视图控制器使用一个实例。

【讨论】:

以上是关于从任何其他视图控制器移动到任何几个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从任何其他视图控制器获取具有视图控制器详细信息的视图层次结构?

将数据从任何视图控制器传递到 iOS 中的一个主视图控制器

从任何其他选项卡的视图控制器中弹出第二个选项卡的根视图(默认)

如何从导航堆栈中的任何位置弹出到任意视图控制器

如何从 AppDelegate.swift 路由到任何视图控制器

UITabBarController,任何可能的方式来移动下一个视图控制器与水平滑动?