2014-01-20 58 views
2

我有以下视图控制器层次结构与父子关系。替换父视图控制器

VC1 - VC2 - VC3 - VC4 - VC5

每个视图控制器是前身的孩子。

我用的代码 -

[parentVC addChildViewController:childVC]; 

    [childVC.view setFrame:parentVC.view.frame]; 

    [parentVC.view addSubview:childVC.view]; 

    [childVC didMoveToParentViewController:parentVC]; 

现在,我想更换VC1到另一个视图控制器,说VC0在这个层次从VC5即行动消除VC2后之后,我想有VC0而不是VC1。如何实现这一目标?

+0

为什么这种关系如此之深?这在用户界面上如何显示? – Wain

+0

我正在将儿童视图的框架设置为父框架。请检查更新的代码。它会给你一个想法。 – Atul

回答

1

UINavigationController提供了一个-setViewControllers:animated:方法,您可以使用该方法修改导航堆栈。它通常用于将应用恢复到用户离开应用时的状态。从文档:

使用此方法更新或替换当前视图控制器堆栈 而不显式推送或弹出每个控制器。此外,此方法允许您更新控制器组而不使动画 发生变化,在您希望 将导航控制器返回到先前状态的启动时,这可能是适当的。

也就是说,使用这种方法来代替视图控制器堆栈中听起来像是从一个UI点可怜的计划 - 这很可能迷惑用户,谁完全相信家长控制器不transmogrify弄成完全不同。

+0

好吧,我同意你的看法,更换父视图控制器是个坏主意。此外,我不使用UINavigationController,因为我必须提供一些花哨的动画,同时显示另一个视图。你周围的任何工作都建议? – Atul

+0

工具都在那里 - UIViewController提供了删除和添加子项以及获取当前子项列表的方法。听起来主要问题在于决定谁应该协调交换机,而这可能是您必须根据应用的需求来决定的。我会先看看通常管理VC1的任何对象 - 也许是应用程序委托。 – Caleb

0

委托是适当的解决方案,源父(委托)通过链传递给叶控制器(即想要回调)。

这是不愉快的事实表明你试图做的事情有点奇怪。但是,不知道这些要求限制了较大的建议。

如果你想欺骗你的出路(你不应该)然后发布通知是少得多的代码。使用块作为委托模式的实现是中等代码。

+0

感谢您的回答,但代表团将如何帮助?主要问题是我想替换superview保持添加视图,因为它在屏幕上。 – Atul

+0

你说这个动作来自V5,所以你需要回消息给根,这样父母和视图才能被切换出来。只要删除一个父母并添加新父母(并交换父视图)。 – Wain

+0

你能否详细说明如何'删除一个父母并添加新父母(并交换父视图)'? – Atul

相关问题