通过代码操作视图层次结构

Posted

技术标签:

【中文标题】通过代码操作视图层次结构【英文标题】:Manipulating view hierarchy by code 【发布时间】:2013-05-27 13:48:04 【问题描述】:

如果我有一个UITabBarController(2 个选项卡)作为根视图控制器,那么在第一个选项卡 (FirstTabViewController) 中,我使用根视图控制器 AddReminderViewController 初始化一个 UINavigationController 并呈现它。

然后在AddReminderViewController 内部,我呈现另一个UINavigationController 并带有一个名为ChooseOptionViewController 的根视图控制器并呈现它。

现在,当我在ChooseOptionViewController 内部时,我想以编程方式返回FirstTabViewController,我怎样才能尽可能简单地做到这一点?我需要在我展示的所有视图控制器上- dismissViewController... 还是有更简单的方法?

同样在ChooseOptionViewController 中,我怎样才能找到呈现ChooseOptionViewController 的课程?我试着做[self.presentingViewController class],但这只是说UINavigationController(不是AddReminderViewController

【问题讨论】:

为什么要创建第二个导航控制器?您可以将所有视图控制器推送到第一个导航控制器上。 @Marcel 这是不久前做出的设计决定...... 【参考方案1】:

现在,当我在 ChooseOptionViewController 中时,我想 以编程方式返回 FirstTabViewController 我该怎么做 尽可能简单?

您真的不应该让 ChooseOptionViewController 尝试自己管理所有这些。它应该简单地告诉它的父母它的工作已经完成并让父母解雇它。然后父母可以告诉它的父母它的工作已经完成,等等。这种方法可以更轻松地维护您的代码,并在您认为有必要时进行更改,而不会破坏 ChooseOptionViewController。

例如,假设 AddReminderViewController 希望发生其他事情,例如在呈现 ChooseOptionsViewController 之后呈现 ChooseMoreOptionsViewController。如果 AddReminderViewController 负责其部分程序的流程,那很容易。如果 ChooseOptionsViewController 对应用程序的重置有足够的了解,可以将视图控制器一直关闭到 FirstTabViewController,那么每次流程发生变化时,您都必须对其进行修改。这不是长期成功的秘诀,而且会增加许多不必要且无益的复杂性。

【讨论】:

正常流程是用户与视图交互,他可以取消(会在ChooseOptionViewController上调用-dismiss...)等等。但是,当应用程序进入后台时,我希望应用程序重置到第一个选项卡。 @PeterWarbo 在这种情况下,您仍然希望父视图控制器负责。一种方法是让应用程序委托或 FirstTabViewController 发布一个通知,让其他控制器(如 AddReminderViewController)监听。该通知的意思是“好的,无论你在做什么,都可以按下按钮并关闭任何模态视图控制器。之后,FirstTabViewController 可以popToRootViewController【参考方案2】:
generally unless an exception you should use only one navigation controller.
keep pushing view controllers onto it.
in that way you can move pop top to root view controller.


for ex:

1
just add one navigation controller to tab 1

2
setrootviewcontroller of navigation controller to FirstTabViewController

3
from FirstTabViewController you can push AddReminderViewController(using the same navigation controller)
ex:- [self.navigationController PushViewController:....];

4
from AddReminderViewController you can push ChooseOptionViewController(using the same navigation controller)
ex:- [self.navigationController PushViewController:....];



5 finally use [self.navigationController popToRootViewController];

【讨论】:

这是不正确的。可以以模态方式呈现导航控制器,以便您可以进行跨越多个视图控制器的模态交互。这通常比在另一个之上呈现一个模态视图控制器更可取...... 好的先生...您需要参考最底部的导航控制器并调用popToRootViewController。 -popToRootViewController 不会关闭以模态方式呈现的视图控制器。

以上是关于通过代码操作视图层次结构的主要内容,如果未能解决你的问题,请参考以下文章

不在只有 2 个视图控制器的视图层次结构中?

如何直接通过点击通知警报打开隐藏在视图层次结构中的视图控制器

通过 JSON 层次结构和 objectForKey 使用 AFNetworking 加载图像视图

如何实现 D3 层次视图

通过 appDelegate openURL 函数呈现 viewController(在导航层次结构中)

iOS10 UI教程层次结构的事件